在 R 中使用 for 循环绑定来自两个数据帧的列时出现问题



我将两个不同的asc文件中的7个加载到R,asc[i]wasc[i]中,[i]表示有1:7ascswascs加载到R中。我需要将wasc[i]asc[i][[1]]结合起来(只有asc[i]的第一列与整个wasc[i]文件(。

应对每对ascwasc文件重复此操作。

代码一直给我空白数据框,所以我不知道为什么这不起作用。命名正确,但代码无法识别asc[i]wasc[i]与以前加载的文件相关联。

任何帮助将不胜感激。

# These data frames will reproduce my issue 
asc1 <- data.frame(x= c(rep("A.tif", 20)), y = 1:20)
wasc1 <- data.frame(x= c(rep("B.tif", 20)), y = c(rep("Imager",20)))
asc2 <- data.frame(x= c(rep("A.tif", 20)), y = 1:20)
wasc2 <- data.frame(x= c(rep("B.tif", 20)), y = c(rep("Imager",20)))
asc3 <- data.frame(x= c(rep("A.tif", 20)), y = 1:20)
wasc3 <- data.frame(x= c(rep("B.tif", 20)), y = c(rep("Imager",20)))

for (i in 1:3) {
d <- paste("asc", i, sep ="")
f <- paste("wasc", i, sep ="")
full_wing <- as.character(paste("full_wing", i, sep = ""))
assign(full_wing,cbind(d[[1]], f))
}
# Output of full_wing1 data frame
dput(full_wing1)
structure(c("asc1", "wasc1"), .Dim = 1:2, .Dimnames = list(NULL, 
c("", "f")))

附加信息:

  1. ASC 文件有 19 列长
  2. WASC 文件长度为 13 列

我只想将asc文件中的第 1 列与整个wasc文件合并,从而剪掉asc文件的剩余 18 列。

# put data in a list
asc = mget(ls(pattern = "^asc"))
wasc = mget(ls(pattern = "^wasc"))
full_wing = Map(f = function(w, a) cbind(w, a[[1]]), w = wasc, a = asc)

Map是并行迭代多个参数的好快捷方式。它返回一个不错的list。您可以使用例如full_wing[[1]]full_wing[[3]]等访问各个元素。Map只是一个快捷方式,上面的代码基本上等同于下面的for循环:

results = list()
for (i in seq_along(asc)) {
results[[i]] = cbind(wasc[[i]], asc[[i]][[1]])
}

我使用mget将数据放入列表中,因为在您的示例中,您已经拥有asc1asc2等对象。一个更好的方法是从一开始就不要创建这些变量,而是直接将文件读取到列表中,如下所示:

asc_paths = list.files(pattern = "^asc")
asc = lapply(asc_paths, read.table)

您可以在如何制作数据框列表?

如果只需要asc文件中的一列,则简化此操作的另一种方法是仅读取所需的列,请参阅仅读取有限数量的列以获取某些建议。

最新更新