如何用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
相关产品推荐
相关产品推荐

