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

如何用R语言(含dplyr)按分组条件计算DataFrame列值并转换

问题描述

我在R语言中有一个名为df1的DataFrame,需要针对continent、country、sex的每组组合,计算category为A和B对应的size列求和值,将该求和结果对应的category改为D,最终得到目标DataFramedf2。

附原始DataFrame的创建代码:

df1 <- data.frame(
  "continent" = c('Europe', 'Europe', 'Europe', 'Europe', 'Europe', 'Europe', 'Asia', 'Asia', 'Asia', 'Asia', 'Asia', 'Asia'),
  "country" = c('Germany', 'Germany', 'Germany', 'Germany', 'Germany','Germany','Japan', 'Japan', 'Japan', 'Japan', 'Japan','Japan'),
  "sex" = c('male', 'male', 'male', 'female', 'female', 'female', 'male', 'male', 'male', 'female', 'female', 'female'),
  "category" = c('A', 'B', 'C','A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'),
  "size" = c(20, 35, 40, 32, 14, 53,18,31, 16,65,13,22)
)
解决方案

方法1:用dplyr实现(推荐新手,代码直观易读)

dplyr是tidyverse生态里的工具包,处理数据框非常方便,首次使用需要先安装:

install.packages("dplyr")
library(dplyr)

执行以下代码完成转换:

df2 <- df1 %>%
  # 筛选A和B类数据,按分组求和并转为D类
  filter(category %in% c("A", "B")) %>%
  group_by(continent, country, sex) %>%
  summarise(category = "D", size = sum(size), .groups = "drop") %>%
  # 合并原始数据里的C类行
  bind_rows(df1 %>% filter(category == "C")) %>%
  # 按分组字段排序,让结果和目标格式一致
  arrange(continent, country, sex, category)

# 查看最终结果
print(df2)

运行后得到的df2就是目标结果,输出如下:

# A tibble: 8 × 5
  continent country  sex    category  size
  <chr>     <chr>    <chr>  <chr>    <dbl>
1 Asia      Japan    female C           22
2 Asia      Japan    female D           78
3 Asia      Japan    male   C           16
4 Asia      Japan    male   D           49
5 Europe    Germany  female C           53
6 Europe    Germany  female D           46
7 Europe    Germany  male   C           40
8 Europe    Germany  male   D           55

方法2:用基础R实现(无需额外安装包)

如果不想安装第三方包,用基础R的函数也能完成:

# 计算A+B的求和结果,生成D类数据
d_data <- aggregate(size ~ continent + country + sex, 
                    data = df1[df1$category %in% c("A", "B"), ],
                    FUN = sum)
d_data$category <- "D"

# 提取原始数据中的C类行
c_data <- df1[df1$category == "C", ]

# 合并两类数据并排序
df2 <- rbind(c_data, d_data)
df2 <- df2[order(df2$continent, df2$country, df2$sex, df2$category), ]

# 调整列顺序,和原始数据保持一致
df2 <- df2[, c("continent", "country", "sex", "category", "size")]

# 查看结果
print(df2)

内容的提问来源于stack exchange,提问作者The Curious One

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:55:22