You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:15:00