R语言使用含相同值的多列实现pivot wider宽表转换
解决方案
你可以先将成对的p/o列转为长格式,去重后按o列分组拼接p值,最后转为宽格式即可,完整代码如下:
library(tidyverse) # 示例数据 tbl <- tibble( p1 = c('Q5SIJ9', 'Q5SIJ9', 'Q5SIJ9', 'Q5SIJ9', 'Q5SIJ9', 'Q5SIJ9', 'K7UUB6', 'A2ZBY1', 'A0A1L8ELU3', 'A2XXE3'), o1 = c('THET2', 'THET2', 'THET2', 'THET2', 'THET2', 'THET2', 'MAIZE', 'ORYSI', 'XENLA', 'ORYSI'), p2 = c('A0A674MM40', 'Q8AXY6', 'A0A1D5NX49', 'Q62838', 'Q7QIP0', 'Q61006', 'Q5SIJ9', 'Q5SIJ9', 'Q5SIJ9', 'Q5SIJ9'), o2 = c('TAKRU', 'CHICK', 'CHICK', 'RAT', 'ANOGA', 'MOUSE', 'THET2', 'THET2', 'THET2', 'THET2') ) # 转换代码 result <- tbl %>% # 拆分成对的p/o列,转为长格式 pivot_longer(everything(), names_to = c(".value", "group"), names_pattern = "(.)(.)") %>% # 去重,去除同一个o下重复的p值 distinct(o, p) %>% # 按o分组,排序后拼接同组的p值 group_by(o) %>% summarise(p = str_sort(p) %>% str_c(collapse = ", ")) %>% # 转为宽格式得到目标表 pivot_wider(names_from = o, values_from = p)
代码说明
pivot_longer步骤通过正则匹配列名,自动把p1/p2合并为p列、o1/o2合并为o列,把每行的两组成对关系拆分为独立行distinct步骤过滤掉同一个物种(o列)下重复的蛋白ID(p列),避免拼接时出现重复值group_by+summarise步骤把同一个物种下的多个蛋白ID按字母排序后用逗号拼接- 最后
pivot_wider把物种作为列名、拼接后的蛋白ID作为值,得到1行的宽表结果
内容的提问来源于stack exchange,提问作者GAURAV DIWAN
相关产品推荐
相关产品推荐

