如何在R语言中合并同名(含历史名称)的行并求和?
解决方案:R语言数据处理两则(市政合并+字符分组求和)
一、市政数据合并与数值求和
针对你提供的市政数据集,核心问题是字符型数值转数值型、统一市政名称、分组求和,直接用tidyverse工具链处理即可:
library(tidyverse) # 加载你的原始数据 df <- structure(list(arbeidsstedskommune = c("4601 Bergen", NA, NA, NA, NA, NA), bostedskommune = c("4629 Modalen", "4631 Alver", "4632 Austrheim", "4634 Masfjorden", "1252 Modalen (1910-2019)", "1256 Meland (1924-2019)"), `2002` = c("0", "0", "0", "0", "0", "0"), `2012` = c("0", "0", "0", "0", "0", "0"), `2022` = c("12", "4171", "177", "90", "0", "0")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame")) # 数据清洗+合并求和流程 df_cleaned <- df %>% # 批量将年份列从字符转数值 mutate(across(c(`2002`, `2012`, `2022`), as.numeric)) %>% # 提取统一市政名:去掉开头编号、括号内的历史标注 mutate(kommune_clean = str_remove_all(bostedskommune, "^\\d+ | \\(.*\\)")) %>% # 按统一市政名分组,对年份列求和,保留有效工作地市政数据 group_by(kommune_clean) %>% summarize( arbeidsstedskommune = first(na.omit(arbeidsstedskommune)), `2002` = sum(`2002`, na.rm = TRUE), `2012` = sum(`2012`, na.rm = TRUE), `2022` = sum(`2022`, na.rm = TRUE) ) # 查看最终结果 df_cleaned
关键说明:
str_remove_all用正则匹配去掉冗余内容:^\\d+匹配开头数字+空格,\\(.*\\)匹配空格+括号内的所有历史标注across批量处理多列转数值,避免重复代码first(na.omit(...))保留arbeidsstedskommune的有效非空值,若有多个有效数据可根据需求调整逻辑
二、示例数据集:字符分组求和
针对你给出的字母分组求和需求,核心是提取字符中的有效标识+分组求和,代码如下:
# 加载示例数据 sample_df <- tibble( a = c("2x", "y.", "4x", "17y"), b = c(100, 50, 20, NA) ) # 处理流程 sample_result <- sample_df %>% # 提取a列中的字母(忽略数字、标点) mutate(a_clean = str_extract(a, "[a-zA-Z]")) %>% # 按提取的字母分组,对b列求和(忽略NA) group_by(a_clean) %>% summarize(b = sum(b, na.rm = TRUE)) %>% # 还原列名 rename(a = a_clean) # 查看结果 sample_result
关键说明:
str_extract(a, "[a-zA-Z]")用正则提取字母,自动忽略前面的数字和后面的标点sum(b, na.rm = TRUE)求和时跳过NA,避免结果变成NA
内容的提问来源于stack exchange,提问作者Maren
相关产品推荐
相关产品推荐

