rbind 列表到 data.frame for 循环

rbind lists to data.frame in for loop

这是我在 R 中计算土地使用的 for 循环的(无意义的)截断版本。它很好地遍历数据,除非它应该使用 plyr::rbind.fill() 将计算绑定到 data.frame。我得到了想要的结果,但也得到了(相同数量的)额外的不需要的列,这些列充满了 NA 值(我想这与列名有关)。

agri_coverage <- data.frame(matrix(rnorm(3), nrow=1))
set.seed(23)
agri <- rnorm(10, 0.5)

land_use <- NULL
for (i in seq_along(agri)) {
name <- agri[i]
if (name > 1) {
  wl <- as.list(unlist(agri_coverage[ ,1:3]))
  } else {   
  wl <- as.list(rep(NA, 3))
  }
  land_use <- rbind.fill(land_use, data.frame(wl)) #combine output
}

将这些列表合并到一个数据框中的最佳函数/方法是什么?为什么会产生这些额外的列?

我尝试了 rbind()data.table::rbindlist() 等其他功能,但没有成功。

您得到额外的用 NA 填充的不需要的列的原因是,您在 else 条件中创建的列表的名称与 if 条件中的列表不同。 rbind.fill 将具有相同名称的列相互附加,任何具有不同名称的列都用 NA 填充。来自 rbind.fill 帮助:

rbinds a list of data frames filling missing columns with NA.

我认为要获得您想要的结果,您只需在 else 条件的末尾添加这一行:

names(wl) <- names(agri_coverage)

代码则变为:

land_use <- NULL
for (i in seq_along(agri)) {
  name <- agri[i]
  if (name > 1) {
    wl <- as.list(unlist(agri_coverage[ ,1:3]))
  } else {   
    wl <- as.list(rep(NA, 3))
    names(wl) <- names(agri_coverage)
  }
  land_use <- rbind.fill(land_use, data.frame(wl)) #combine output
}

这导致:

 land_use
          X1        X2         X3
1         NA        NA         NA
2         NA        NA         NA
3  0.2182885 -1.046535 -0.2886886
4  0.2182885 -1.046535 -0.2886886
5  0.2182885 -1.046535 -0.2886886
6  0.2182885 -1.046535 -0.2886886
7         NA        NA         NA
8  0.2182885 -1.046535 -0.2886886
9         NA        NA         NA
10 0.2182885 -1.046535 -0.2886886