将一堆Excel文件作为数据框加载,使用dictionnary列表标准化列名,因为它假定一半列注定要在其他数据框中,我试图拆分&使用rbind.fill
包中的dplyr
将它们全部堆叠。
问题是它们中的一些有90列,有些是56,有些只有23,所以在选择列时(我得到了split1,split2的列名列表)幸运的是,你得到了所有这些,但其他一些时候你没有。
# this is supposed to be in a loop splitting & stacking all df
split1 <- df[ ,c("column1","column2","column3")]
Error in `[.data.frame`(df, , c("column1","column2","column3")) :
undefined columns selected
有没有办法从数据框中选择列,无论上述列是否不可用?
我不关心列是否填充NA或任何其他值(0,NULL ...)。只需要正确选择堆叠所有split1,split2 ....
找到一些不是完全相同的问题和使用data.table
包的SO答案。碱性R溶液是优选的。
答案 0 :(得分:1)
我们可以使用setdiff
查找不在列名中的元素并将其分配给NA
v1 <- c("column1","column2","column3")
nm1 <- setdiff(v1, names(df))
df[nm1] <- NA
df[v1]
为了便于使用,可以将其包装为函数
fCol <- function(vec, dat){
nm1 <- setdiff(vec, names(dat))
dat[nm1] <- NA
dat[vec]
}
fCol(v1, df)
# column1 column2 column3
#1 1 NA NA
#2 2 NA NA
#3 3 NA NA
#4 4 NA NA
#5 5 NA NA
df <- data.frame(column1 = 1:5, col2 = 6:10)
答案 1 :(得分:1)
有时它不需要特定的技巧或代码提示。只是重新解决问题会给你一个相当简洁的解决方案。
我会假设整堆Excel文件都有所有需要的列(如果不是这样,请告诉我。)
因此,鉴于所有文件都包含所有列....为什么不使用dplyr::rbind.fill
堆叠所有文件,并且在所有文件都在一个数据框中之后,然后拆分。
伪代码:
enormous <- data.frame()
for (i in 1:length(dfs)) {
enormous <- rbind.fill(enormous, i)
}
# then split
split1 <- subset columns from enormous
split2 <- subset columns from enormous
代码更少,计算机密集程度更低。考虑到子集化列然后拆分必须按文件完成,但堆叠所有更容易(是的,你可以在这里使用data.table
技巧)并且必须只是一个分裂步骤。
对您的问题这是一种有效的方法吗?