部分键存在多值时如何使用tidyr::pivot_wider实现字符值拼接
解决方案
方案1:直接分组聚合(最简便,tidyverse生态)
你要实现的按ColA分组拼接ColB的需求,直接用dplyr的分组汇总逻辑即可,不需要做宽长转换:
library(tidyverse) df <- data.frame(ColA=c("A", "B", "B", "C"), ColB=letters[23:26]) df %>% group_by(ColA) %>% summarise(ColB = paste(ColB, collapse = ""))
运行后直接得到你期望的两列结果:
ColA ColB 1 A w 2 B xy 3 C z
方案2:使用pivot_wider实现(需生成宽格式时使用)
values_fn完全支持paste类字符处理函数,你只需要通过匿名函数指定collapse参数,将同组的多个字符值拼接为单个字符串即可:
df %>% pivot_wider( names_from = ColA, values_from = ColB, values_fn = ~ paste(.x, collapse = "") )
运行后得到宽格式结果,无警告也不会生成列表列:
# A tibble: 1 × 3 A B C <chr> <chr> <chr> 1 w xy z
方案3:data.table实现(适合大数据量场景)
如果处理的数据集较大,可以用data.table的语法实现,运行效率更高:
library(data.table) setDT(df)[, .(ColB = paste(ColB, collapse = "")), by = ColA]
内容的提问来源于stack exchange,提问作者hmg
相关产品推荐
相关产品推荐

