如何修改dplyr的summarise_all(n_distinct)统计排除"bla"的不同类别数
用dplyr统计排除特定类别("bla")的唯一值数量
嘿,我来帮你搞定这个问题!首先明确你的需求:要对数据框的每一列,统计**不等于"bla"**的不同类别数量——原代码d1 %>% summarise_all(n_distinct)会把"bla"也算进去,所以得调整一下逻辑。
先回顾下你的示例数据:
> d1 # A tibble: 5 x 2 x y <chr> <chr> 1 yellow A 2 green A 3 green bla 4 blue B 5 bla bla
两种可行的修改方案
方案1:用summarise_all结合匿名函数(兼容旧版dplyr)
直接在summarise_all里对每列先筛选掉"bla",再统计唯一值数量:
d1 %>% summarise_all(~n_distinct(.[. != "bla"]))
这里的~是定义匿名函数的简写,.代表当前处理的列,.[. != "bla"]就是取出当前列中所有不等于"bla"的值,接着用n_distinct统计这些值的唯一数量。运行后就能得到x列3、y列2的结果。
方案2:用across(dplyr 1.0.0+推荐写法)
如果你用的是dplyr 1.0.0及以上版本,官方更推荐用across替代summarise_all(后者已经被软弃用),代码可读性更强:
d1 %>% summarise(across(everything(), ~n_distinct(.[. != "bla"])))
across(everything())表示对数据框的所有列应用后面的函数,逻辑和方案1完全一致,结果也相同。
最终输出结果
运行上述任意一段代码,都会得到符合预期的结果:
# A tibble: 1 x 2 x y <int> <int> 1 3 2
内容的提问来源于stack exchange,提问作者Omry Atia
相关产品推荐
相关产品推荐

