如何在R中合并相似国家销售额并存储为独立dataframe?
在R中合并同类国家并求和销售额的解决方案
完整实现代码(dplyr + stringr)
# 加载所需包 library(dplyr) library(stringr) # 构造你的示例数据框 df <- data.frame( Country = c("Spain 1", "Spain 2", "France", "Nigeria 1", "Nigeria 2"), Sales = c(1000, 200, 300, 500, 700), stringsAsFactors = FALSE ) # 处理国家名称并分组求和 sum_df <- df %>% # 移除国家名称末尾的空格和数字 mutate(Country = str_remove(Country, "\\s+\\d+$")) %>% # 按处理后的国家名称分组 group_by(Country) %>% # 计算每组销售额总和 summarise(Sum_of_sales = sum(Sales, na.rm = TRUE)) %>% # 取消分组,转为普通数据框 ungroup() # 查看结果 sum_df
运行后会得到你预期的输出:
# A tibble: 3 × 2 Country Sum_of_sales <chr> <dbl> 1 France 300 2 Nigeria 1200 3 Spain 1200
关键步骤解释
- 清洗国家名称:使用
str_remove配合正则表达式\\s+\\d+$,精准移除国家名称末尾的空格和数字,确保"Spain 1""Spain 2"统一为"Spain",无后缀的国家名称保持不变。 - 分组求和:通过
group_by按清洗后的国家名称分组,再用summarise计算每组的销售额总和,na.rm = TRUE用于处理可能存在的缺失值,避免求和报错。 - 取消分组:
ungroup()将分组后的 tibble 转为普通数据框,方便后续操作。
Base R 替代方案(无需额外包)
如果不想加载dplyr和stringr,可以用Base R实现:
# 构造数据框 df <- data.frame( Country = c("Spain 1", "Spain 2", "France", "Nigeria 1", "Nigeria 2"), Sales = c(1000, 200, 300, 500, 700), stringsAsFactors = FALSE ) # 清洗国家名称 df$Country <- sub("\\s+\\d+$", "", df$Country) # 分组求和并修改列名 sum_df_base <- aggregate(Sales ~ Country, data = df, sum, na.rm = TRUE) colnames(sum_df_base)[2] <- "Sum_of_sales" # 查看结果 sum_df_base
内容的提问来源于stack exchange,提问作者Surely
相关产品推荐
相关产品推荐

