You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:30:53