从data.frame行提取字符列表值并重塑数据
解决R语言数据重塑:拆分字符列并保留唯一(id,x)对
嘿,我来帮你搞定这个数据格式转换的需求!你想要把每行带逗号分隔字符的x列拆分成单独行,然后保留唯一的(id,x)配对对吧?这里有两种简单的方法可以实现:
方法一:用tidyverse工具包(推荐,代码更简洁直观)
tidyverse里的tidyr::separate_rows可以直接帮你拆分字符列并展开成多行,再配合dplyr::distinct去重就搞定了:
# 先安装并加载tidyverse(如果还没装的话) # install.packages("tidyverse") library(tidyverse) # 你的原始数据 dat <- data.frame(id = c(rep('a',2),rep('b',2),'c'), x = c('f,o','f,o,o','b,a,a,r','b,a,r','b,a'), stringsAsFactors = F) # 拆分+去重一步到位 dat2 <- dat %>% separate_rows(x, sep = ",") %>% # 按逗号拆分x列,把每个字符单独成一行 distinct(id, x) # 保留唯一的(id,x)组合 # 查看结果 dat2
运行后输出的结果就是你想要的:
id x 1 a f 2 a o 3 b b 4 b a 5 b r 6 c b 7 c a
方法二:Base R实现(不用额外安装包)
如果你不想加载第三方包,用Base R的strsplit和unique也能实现:
# 你的原始数据 dat <- data.frame(id = c(rep('a',2),rep('b',2),'c'), x = c('f,o','f,o,o','b,a,a,r','b,a,r','b,a'), stringsAsFactors = F) # 拆分x列成字符列表 split_x <- strsplit(dat$x, ",") # 生成对应每个拆分字符的id列表(每个id重复对应拆分后的元素个数) id_list <- mapply(rep, dat$id, sapply(split_x, length)) # 组合成临时数据框 temp_df <- data.frame(id = unlist(id_list), x = unlist(split_x), stringsAsFactors = FALSE) # 去重得到最终结果 dat2_base <- unique(temp_df) # 查看结果 dat2_base
这个方法也能得到和上面完全一致的结果~
内容的提问来源于stack exchange,提问作者kathystehl
相关产品推荐
相关产品推荐

