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

R语言数据框新增列:相同非订单列对应订单求和并去重

解决方案:在R中按分组求和并去重

要实现你需要的功能——新增订单求和列并移除重复行,我们可以用dplyr包(语法更直观)或者Base R来完成。下面是两种方法的详细步骤:

方法一:使用dplyr包(推荐)

dplyr的分组操作非常适合这类需求,代码可读性高,步骤清晰:

步骤说明:

  1. 按除orders外的所有列分组,确保相同特征的行被归为一组
  2. 计算每组的订单总和,新增sum列
  3. 标记组内的行号,将每组除最后一行外的sum设为0(匹配你示例中的格式)
  4. 过滤掉sum为0的行,消除重复数据
  5. 取消分组,得到最终结果

完整代码:

# 加载dplyr包(如果未安装先运行 install.packages("dplyr"))
library(dplyr)

# 构造你的示例数据框
df <- data.frame(
  orderdate = c("wednesday", "wednesday", "thursday", "thursday"),
  orderhour = c("12:00", "12:00", "13:00", "13:00"),
  deliverydate = c("Friday", "Friday", "Friday", "Friday"),
  deliveryhour = c("17:00", "17:00", "17:00", "19:00"),
  orders = c(5, 2, 3, 1)
)

# 处理数据
df_processed <- df %>%
  group_by(across(-orders)) %>%  # 按除orders外的所有列分组
  mutate(sum = sum(orders)) %>%  # 计算每组订单总和
  mutate(row_num = row_number()) %>%  # 标记组内行号
  mutate(sum = ifelse(row_num != n(), 0, sum)) %>%  # 非最后一行sum设为0
  select(-row_num) %>%  # 移除辅助列
  filter(sum != 0) %>%  # 过滤掉sum为0的行
  ungroup()  # 取消分组

# 查看结果
print(df_processed)

运行结果:

# A tibble: 3 × 6
  orderdate  orderhour deliverydate deliveryhour orders   sum
  <chr>      <chr>     <chr>        <chr>         <dbl> <dbl>
1 wednesday  12:00     Friday       17:00            2     7
2 thursday   13:00     Friday       17:00            3     3
3 thursday   13:00     Friday       19:00            1     1

方法二:使用Base R(无需额外包)

如果你不想安装额外包,Base R的ave函数也能实现相同功能:

完整代码:

# 构造示例数据框
df <- data.frame(
  orderdate = c("wednesday", "wednesday", "thursday", "thursday"),
  orderhour = c("12:00", "12:00", "13:00", "13:00"),
  deliverydate = c("Friday", "Friday", "Friday", "Friday"),
  deliveryhour = c("17:00", "17:00", "17:00", "19:00"),
  orders = c(5, 2, 3, 1)
)

# 计算每组订单总和
df$sum <- ave(df$orders, df[, names(df) != "orders"], FUN = sum)
# 标记组内行号
df$row_num <- with(df, ave(orders, df[, names(df) != "orders"], FUN = seq_along))
# 获取每组的总行数
df$group_n <- with(df, ave(orders, df[, names(df) != "orders"], FUN = length))
# 将非最后一行的sum设为0
df$sum <- ifelse(df$row_num != df$group_n, 0, df$sum)
# 过滤并移除辅助列
df_processed <- df[df$sum != 0, !(names(df) %in% c("row_num", "group_n"))]

# 查看结果
print(df_processed)

运行结果:

orderdate orderhour deliverydate deliveryhour orders sum
2 wednesday     12:00        Friday        17:00      2   7
3  thursday     13:00        Friday        17:00      3   3
4  thursday     13:00        Friday        19:00      1   1

两种方法都能完美匹配你的需求:重复组只保留一行(求和后的结果),唯一行的sum等于自身orders值,最终消除了重复数据。

内容的提问来源于stack exchange,提问作者Lara Vandooren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:05:56