使用dplyr::select_if多条件筛选列时报错的技术求助
解决方案:用dplyr保留元数据列并移除求和为0的m开头列
我来帮你搞定这个问题!你遇到的报错是因为select_if()的判断条件逻辑不对,导致生成的选择向量长度和数据框列数不匹配。咱们一步步来解决:
报错原因分析
你之前的代码里,!(grepl("m",names(.)))会生成一个长度等于列数的逻辑向量(对应每一列是否非m开头),但sum(.) > 0是对整个数据框求和得到的单个逻辑值。用||连接时,R会把长度大于1的向量强制转成单个逻辑值,最终得到的选择向量长度为1,而你的数据框有4列,所以触发了「.p尺寸不匹配」的错误。
正确的写法
我们需要对每一列单独判断:要么是元数据列(非m开头),要么是m开头且求和大于0的列。这里可以用cur_column()函数获取当前列的名称,结合列值的求和来判断:
方法1:使用select_if()(兼容旧版dplyr)
library(dplyr) df %>% select_if(~ !grepl("m", cur_column()) || sum(.) > 0)
方法2:使用select() + where()(dplyr推荐的现代写法)
现在dplyr更推荐用where()配合select()来做列筛选,逻辑更清晰:
df %>% select(where(~ !grepl("m", cur_column()) || sum(.) > 0))
结果验证
运行上述代码后,会保留id列(元数据)以及求和大于0的m1、m2列,自动移除求和为0的m3列,输出结果如下:
id m1 m2 1 a 12 14 2 b 11 9 3 c 10 10 4 a 16 1 5 b 5 15 6 c 8 7 7 a 9 12 8 b 13 8 9 c 11 16
这样就完美满足你的需求:不用拆分数据框,同时保留元数据和符合条件的原始数据列。
内容的提问来源于stack exchange,提问作者Alex Romer
相关产品推荐
相关产品推荐

