如何用dpplyr更简洁地按行统计指定列中'-999'的数量?
更简洁的实现方式(使用rowSums)
直接利用rowSums结合across可以一步完成需求,无需创建中间列或使用rowwise,代码更简洁高效:
library(dplyr) df = tibble(a = c('-999', 'b', '-999'), b = c('-999', 'a', 'b'), c = 1:3) df %>% mutate(sum999 = rowSums(across(c(a, b), ~ .x == '-999')))
输出结果:
# A tibble: 3 × 4 a b c sum999 <chr> <chr> <int> <dbl> 1 -999 -999 1 2 2 b a 2 0 3 -999 b 3 1
原理说明:
across(c(a, b), ~ .x == '-999'):对指定列(a、b)逐元素判断是否等于'-999',生成一个逻辑矩阵(TRUE/FALSE)rowSums():对每行的逻辑值求和,TRUE会被自动转换为1,FALSE转换为0,直接得到每行符合条件的数量
如果需要用正则表达式匹配列名(比如匹配以a或b开头的列),可以把c(a, b)换成matches('^[ab]'):
df %>% mutate(sum999 = rowSums(across(matches('^[ab]'), ~ .x == '-999')))
这种方法相比原实现的优势:
- 无需创建临时列,减少内存占用
- 避免
rowwise()分组,处理大数据集时性能更优 - 代码逻辑更直观,一步到位
内容的提问来源于stack exchange,提问作者Juan C
相关产品推荐
相关产品推荐

