如何在dplyr的summarise across中处理有时缺失的列?
处理跨数据框的列求和(部分列可能不存在)
正常运行的情况
如果指定的列都在数据框里,这段代码能正常算出各列的总和:
df <- data.frame(a=c(1,2,3),b=c(4,2,3),c=c(2,5,1)) df %>% summarise(across( c(a,b,c), sum, na.rm=TRUE))
触发报错的情况
要是指定了数据框里没有的列(比如下面的d列),代码直接就报错了:
df <- data.frame(a=c(1,2,3),b=c(4,2,3),c=c(2,5,1)) df %>% summarise(across( c(a,b,c,d), sum, na.rm=TRUE))
实际需求
这段代码是某个函数的一部分,我要用lapply把它套在一堆数据框组成的列表上。其中d列几乎每个数据框都有,所以不能直接把它从列列表里删掉。我想要的效果是:不管列列表里的列存不存在,只对实际存在的列求和,不存在的自动跳过。
解决办法
用dplyr里的any_of()函数就行,注意要把列名写成字符串向量(不能直接写裸列名,不然不存在的列会先触发报错),代码如下:
df <- data.frame(a=c(1,2,3),b=c(4,2,3),c=c(2,5,1)) df %>% summarise(across( any_of(c("a","b","c","d")), sum, na.rm=TRUE))
这段代码会自动识别数据框里存在的列(这里就是a、b、c)并计算总和,完全忽略不存在的d列,不会报错。
内容的提问来源于stack exchange,提问作者Justin Beresford
相关产品推荐
相关产品推荐

