【问题标题】:rbind lists to data.frame in for looprbind 列表到 for 循环中的 data.frame
【发布时间】:2016-07-15 18:13:58
【问题描述】:

这是我在 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()等其他功能,但没有成功。

【问题讨论】:

  • rbind.fill(它是 dplyr 的继任者 bind_rows)为每个向量寻找相同的名称以对齐它们,而您的 NAs 没有名称。如果您将else 更改为wl &lt;- as.list(setNames(rep(NA, 3), names(agri_coverage))),它将起作用。更典型的基本方法是do.call(rbind, lapply(agri, function(x){if(x &gt; 1){agri_coverage} else {rep(NA, 3)}}))
  • 我想的方式很复杂。感谢您的解释!

标签: r loops rbind


【解决方案1】:

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

rbind 使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多