假设我有 5 个具有相同列但行长不同的数据框。我想制作 1 个数据帧,它从 5 个数据帧中的每一个中获取一个特定的列,并在没有长度匹配的地方填充 NA(或其他)。我在这里看到了一些问题,这些问题显示了如何使用一次性向量来做到这一点,但我正在寻找一种方法来处理更大的数据集。
例如:2个等长的数据帧:
long <- data.frame(accepted = rnorm(350, 2000), cost = rnorm(350,5000))
long2 <- data.frame(accepted = rnorm(350, 2000), cost = rnorm(350,5000))
我可以创建一个组合它们的列表,然后创建一个空数据框并使用列表中数据框的公共变量填充它:
list1 <- list(long, long2)
df1 <- as.data.frame(matrix(0, ncol = 5, nrow = 350))
df1[,1:2] <- sapply(list, '[[', 'accepted')
它有效。
但是当我有更多长度不等的数据帧时,这种方法会失败:
long <- data.frame(accepted = rnorm(350, 2000), cost = rnorm(350,5000))
long2 <- data.frame(accepted = rnorm(350, 2000), cost = rnorm(350,5000))
medlong <- data.frame(accepted = rnorm(300, 2000), cost = rnorm(300,5000))
medshort <- data.frame(accepted = rnorm(150, 2000), cost = rnorm(150,5000))
short <- data.frame(accepted = rnorm(50, 2000), cost = rnorm(50,5000))
现在制作列表和组合数据框:
list2 <- list(long, long2, medlong, medshort, short)
df2 <- as.data.frame(matrix(0, ncol = 5, nrow = 350))
df1[,1:5] <- sapply(list, '[[', 'accepted')
我收到有关尺寸不匹配的错误:
[<-.data.frame
(*tmp*
, , 1:5, value = c(1998.77096640377, : 替换有 700 个项目,需要 1750个
我发现用与其他数据帧长度不等的列填充此数据帧的唯一解决方案是:
combined.df <- as.data.frame(matrix(0, ncol = 5, nrow = 350))
combined.df[,1] <- long[,2]
combined.df[,2] <- c(medlong[,2], rep(NA, nrow(long) - nrow(medlong))
但是必须有一种更优雅、更快捷的方法来做到这一点……我知道我在这里遗漏了一些巨大的概念