R语言中dplyr的rowwise行求和功能异常问题
按行求和出错的原因及解决方法
数据集
为说明问题,模拟了如下数据集:
#### 设置随机种子 #### set.seed(123) #### 创建数据框 #### df <- data.frame(x1 = rbinom(n=100, size=1, prob = .5), x2 = rbinom(n=100, size=1, prob = .5), x3 = rbinom(n=100, size=1, prob = .5)) #### 转换为Tibble #### tibble <- df %>% as_tibble()
问题描述
运行以下rowwise()汇总代码时:
#### 按行汇总数值 #### tibble %>% rowwise() %>% mutate(Sum.X = sum(., na.rm = T))
得到的结果不符合预期,所有行的Sum.X值均为145,显然不是按行求和的结果:
# A tibble: 100 × 4 # Rowwise: x1 x2 x3 Sum.X <int> <int> <int> <int> 1 0 1 0 145 2 1 0 1 145 3 0 0 1 145 4 1 1 1 145 5 1 0 0 145 6 0 1 1 145 7 1 1 0 145 8 1 1 0 145 9 1 0 0 145 10 0 0 0 145 # … with 90 more rows
预期的按行求和结果应为:
# A tibble: 100 × 4 # Rowwise: x1 x2 x3 Sum.X <int> <int> <int> <int> 1 0 1 0 1 2 1 0 1 2 3 0 0 1 1 4 1 1 1 3 5 1 0 0 1 6 0 1 1 2 7 1 1 0 2 8 1 1 0 2 9 1 0 0 2 10 0 0 0 0 # … with 90 more rows
原因分析与解决方法
问题根源
代码中sum(.)的.指代整个tibble对象,而非当前行的数值。即便开启rowwise(),sum(.)依然会计算所有列所有行的总和,导致每行结果都是全局总和145。
正确实现方式
方式1:明确指定求和列
直接列出需要求和的列,rowwise()会按行计算这些列的和:
tibble %>% rowwise() %>% mutate(Sum.X = sum(x1, x2, x3, na.rm = TRUE))
方式2:用c_across()批量选列
如果列名有规律(比如以x开头),用c_across()批量选择列更灵活:
tibble %>% rowwise() %>% mutate(Sum.X = sum(c_across(starts_with("x")), na.rm = TRUE))
方式3:用rowSums()直接按行求和
rowSums()是base R专门的按行求和函数,无需rowwise(),效率更高:
tibble %>% mutate(Sum.X = rowSums(., na.rm = TRUE))
也可以指定特定列:
tibble %>% mutate(Sum.X = rowSums(select(., starts_with("x")), na.rm = TRUE))
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

