如何处理含重复信息的建筑数据集长表转宽表问题
如何处理含重复信息的建筑数据集长表转宽表问题
嗨,这个场景太常见了!你遇到的问题核心是同一个建筑ID的同一种属性(比如Exterior)有多个描述值,直接用pivot_wider会生成列表格式的列,而不是你想要的合并后字符串。解决思路很简单:先把每个ID+属性类型对应的多个描述值合并成一个字符串,再转宽表就搞定了。
先看你原来的代码问题:直接跑pivot_wider的话,遇到重复的ID+TYPE组合,会把DESCR变成列表(比如ID3的Exterior列会是list("Aluminum", "Stucco")),这显然不是你想要的效果。
下面是修正后的完整代码,我会一步步解释:
# 你的原始数据 struct_data <- data.frame(ID = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4), TYPE = c("Foundation", "Condition", "Exterior", "Foundation", "Foundation", "Condition", "Exterior", "Foundation", "Condition", "Exterior", "Exterior", "Foundation", "Condition", "Exterior"), DESCR = c("Slab", "Fair", "Brick", "Crawl Space", "Crawl Space", "Good", "Stucco", "Crawl Space", "Bad", "Aluminum", "Stucco", "Slab", "Fair", "Brick")) library(tidyverse) # 第一步:分组合并重复属性的描述值 cleaned_data <- struct_data %>% group_by(ID, TYPE) %>% # 按建筑ID和属性类型分组 summarise(DESCR = str_c(DESCR, collapse = " & "), .groups = "drop") # 把同组的描述用" & "拼接,然后取消分组 # 第二步:转宽表 wide_struct_data <- cleaned_data %>% pivot_wider( names_from = TYPE, values_from = DESCR )
代码解释:
- 分组:
group_by(ID, TYPE)确保我们把同一个建筑的同一种属性(比如ID3的Exterior)归到一组,这样后续可以处理组内的多个描述值。 - 合并字符串:
str_c(DESCR, collapse = " & ")把组内的所有DESCR值用" & "连接成一个字符串,比如ID3的Exterior就会变成Aluminum & Stucco;.groups = "drop"是为了避免分组残留影响后续操作。 - 转宽表:这时候再用
pivot_wider,每个ID对应的每个属性就只有一个合并后的字符串,不会再出现重复或列表格式的问题。
运行后你会得到这样的结果:
> wide_struct_data # A tibble: 4 × 4 ID Foundation Condition Exterior <dbl> <chr> <chr> <chr> 1 1 Slab & Crawl Space Fair Brick 2 2 Crawl Space Good Stucco 3 3 Crawl Space Bad Aluminum & Stucco 4 4 Slab Fair Brick
额外小技巧:
如果你的数据里存在同一个ID+TYPE下的重复描述值(比如某建筑的Exterior有两个"Brick"),可以在合并前加一步去重:
cleaned_data <- struct_data %>% group_by(ID, TYPE) %>% distinct(DESCR, .keep_all = TRUE) %>% # 去掉组内重复的描述值 summarise(DESCR = str_c(DESCR, collapse = " & "), .groups = "drop")
这样就能保证每个描述值只会出现一次啦!
备注:内容来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

