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