如何将data.frame中唯一代码关联的多区域转换为宽格式数据?
嘿,这问题我熟!你想要的是把每个唯一代码对应的所有关联居住区域整理成一行,要么合并成一个字符串列,要么拆分成多个单独的区域列对吧?我用R的tidyverse工具包给你写两种实用的解决方案,直接就能跑~
解决方案
首先先还原你提供的示例数据:
# 构造示例数据 library(tibble) df <- tibble( A = c(1483, 1483, 1483, 1483, 1423, 1423), B = c("De Rijp", "De Rijp", "De Rijp-Gracht", "De Rijp-Gracht", "Huiswaard", "Huiswaard") )
方法1:将关联区域合并为单个字符串列
这种方式适合后续需要对区域列表做字符串处理的场景,我们先去除重复的A-B组合,再按代码分组合并区域:
library(dplyr) library(stringr) df_combined <- df %>% distinct(A, B) %>% # 去掉重复的代码-区域组合 group_by(A) %>% summarise(所有关联区域 = str_c(B, collapse = ", "), .groups = "drop") # 查看结果 df_combined
输出会是这样:
# A tibble: 2 × 2 A 所有关联区域 <dbl> <chr> 1 1423 Huiswaard 2 1483 De Rijp, De Rijp-Gracht
方法2:将关联区域拆分为多个独立列
如果需要把每个区域单独放在一列里(比如区域1、区域2...),可以用pivot_wider来实现:
library(dplyr) library(tidyr) df_wide <- df %>% distinct(A, B) %>% group_by(A) %>% mutate(区域列名 = paste0("区域", row_number())) %>% # 给每个区域生成列名 pivot_wider(names_from = 区域列名, values_from = B) %>% ungroup() # 查看结果 df_wide
输出会是这样:
# A tibble: 2 × 3 A 区域1 区域2 <dbl> <chr> <chr> 1 1423 Huiswaard NA 2 1483 De Rijp De Rijp-Gracht
注意事项
- 第一步的
distinct(A, B)是为了去除原始数据中重复的代码-区域组合,避免同一个区域被多次添加。如果你的原始数据里没有重复的A-B对,可以跳过这一步。 - 如果某个代码对应更多区域,方法2会自动生成对应的
区域3、区域4等列,非常灵活。
内容的提问来源于stack exchange,提问作者Hannie
相关产品推荐
相关产品推荐

