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
这是我在 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