选择数据框列,即使它们不存在

时间:2017-02-14 19:42:17

标签: r

将一堆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溶液是优选的。

2 个答案:

答案 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技巧)并且必须只是一个分裂步骤。

对您的问题这是一种有效的方法吗?