rbind列出到for循环中的data.frame

时间:2016-07-15 18:13:59

标签: r loops rbind

这是我在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()而没有成功。

1 个答案:

答案 0 :(得分:1)

由于您在else条件中创建的列表的名称与if条件中的列表不同,因此您获得了充满NAs的其他不需要的列的原因。 rbind.fill将具有相同名称的列附加到彼此,并且具有不同名称的任何列都填充NA。来自rbind.fill帮助:

  

用NA填充缺少列的数据框列表。

我认为,为了得到您想要的结果,您可以在其他条件结束时添加此行:

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