拆分折叠列至多行并保留分组信息(R语言tidyr场景)
解析带子分组的折叠ID列,生成长格式数据框
原始数据如下:
mydf <- data.frame(group=LETTERS[1:5], code=101:105, ids=c('g1:id1,id2,id3\ng2:id4,id5', 'id6,id7,id8,id9', 'g1:id10,id11\ng3:id12', 'g2:id13,id14', 'id15'))
可以通过tidyr和dplyr的组合操作,分三步完成解析:
library(tidyr) library(dplyr) mydf_new <- mydf %>% # 按换行符拆分每个ids条目,得到子分组对应的ID块(无分组的行保留原ID列表) separate_longer_delim(ids, delim = "\n") %>% # 拆分subgroup和ID列表,无冒号的行自动填充subgroup为NA separate(ids, into = c("subgroup", "id_list"), sep = ":", fill = "left") %>% # 按逗号拆分ID列表为单独行,并重命名列 separate_longer_delim(id_list, delim = ",") %>% rename(id = id_list) %>% select(group, code, id, subgroup) # 输出结果 mydf_new
操作说明
separate_longer_delim(ids, delim = "\n"):将单元格内用换行分隔的子分组块拆分为独立行,比如A组的两个子分组会拆成两行。separate(..., fill = "left"):针对带冒号的块拆分出子分组和ID列表,没有冒号的条目(如B、E组)会把子分组设为NA,确保所有行都能匹配列结构。separate_longer_delim(id_list, delim = ","):把每个ID列表按逗号拆分为单独行,实现最终的长格式转换。
运行后得到的结果与期望完全一致:
> mydf_new group code id subgroup 1 A 101 id1 g1 2 A 101 id2 g1 3 A 101 id3 g1 4 A 101 id4 g2 5 A 101 id5 g2 6 B 102 id6 <NA> 7 B 102 id7 <NA> 8 B 102 id8 <NA> 9 B 102 id9 <NA> 10 C 103 id10 g1 11 C 103 id11 g1 12 C 103 id12 g3 13 D 104 id13 g2 14 D 104 id14 g2 15 E 105 id15 <NA>
内容的提问来源于stack exchange,提问作者DaniCee
相关产品推荐
相关产品推荐

