如何在tidyverse中不转宽格式为mpg数据集按组新增class标识outdoors并计算hwy总和
解决方案
当然可以在tidyverse中不转换为宽格式实现需求,你的代码问题在于试图给不存在的class="outdoors"观测赋值,且求和逻辑的写法有误。以下分两种常见需求场景给出实现代码:
场景1:新增class="outdoors"的汇总行(每组一行,记录目标厂商hwy总和)
如果需要为每个group添加一行class="outdoors"的汇总数据,对应该组内jeep、land rover、subaru车型的hwy里程总和,代码如下:
library(tidyverse) data(mpg) # 定义目标厂商集合 target_mfrs <- c("jeep", "land rover", "subaru") mpg_new <- mpg %>% # 添加group列,每组117行 mutate(group = rep(c(1, 2), times = 117)) %>% # 按group分组计算目标厂商的hwy总和,构造汇总行 group_by(group) %>% summarise( class = "outdoors", hwy = sum(hwy[manufacturer %in% target_mfrs], na.rm = TRUE), # 其他非必要列用NA填充,若需保留可按需调整 .groups = "drop" ) %>% # 将汇总行与原数据合并 bind_rows(mpg %>% mutate(group = rep(c(1, 2), times = 117))) %>% # 可选:按group排序,方便查看 arrange(group)
场景2:将目标厂商的class替换为outdoors,便于后续分组计算
如果需要把原数据中jeep、land rover、subaru车型的class直接替换为outdoors,之后可按group和class分组求和,代码如下:
library(tidyverse) data(mpg) target_mfrs <- c("jeep", "land rover", "subaru") mpg_new <- mpg %>% mutate(group = rep(c(1, 2), times = 117)) %>% group_by(group) %>% # 替换目标厂商的class为outdoors mutate(class = ifelse(manufacturer %in% target_mfrs, "outdoors", class)) %>% # 可选:直接计算每组outdoors类别的hwy总和 summarise(outdoors_hwy_total = sum(hwy[class == "outdoors"], na.rm = TRUE), .groups = "drop")
关键说明
- 使用
manufacturer %in% 向量的方式批量筛选目标厂商,比逐个判断更简洁。 - 添加
na.rm = TRUE避免因缺失值导致求和结果为NA。 - 两种方案均无需转换为宽格式,完全基于tidyverse的分组、汇总、合并逻辑实现。
内容的提问来源于stack exchange,提问作者ksinva
相关产品推荐
相关产品推荐

