R语言数据框新增列:相同非订单列对应订单求和并去重
解决方案:在R中按分组求和并去重
要实现你需要的功能——新增订单求和列并移除重复行,我们可以用dplyr包(语法更直观)或者Base R来完成。下面是两种方法的详细步骤:
方法一:使用dplyr包(推荐)
dplyr的分组操作非常适合这类需求,代码可读性高,步骤清晰:
步骤说明:
- 按除
orders外的所有列分组,确保相同特征的行被归为一组 - 计算每组的订单总和,新增
sum列 - 标记组内的行号,将每组除最后一行外的
sum设为0(匹配你示例中的格式) - 过滤掉
sum为0的行,消除重复数据 - 取消分组,得到最终结果
完整代码:
# 加载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
相关产品推荐
相关产品推荐

