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

如何简洁实现两组关联列的并行pivot_longer透视?

简化关联列的pivot_longer操作

现有数据框包含well_short列,以及两组关联列(reporter1/reporter2、target1/target2),需要将这两组列并行执行pivot_longer操作,替代当前两步pivot_longer加过滤的繁琐代码。

数据示例

data <- structure(list(well_short = c("A1", "A2", "A3", "A4", "A5", "A6", 
"A7", "A8", "A9", "A10", "A11", "A12", "B1", "B2", "B3", "B4", 
"B5", "B6", "B7", "B8"), reporter1 = c("FAM", "FAM", "FAM", "FAM", 
"FAM", "FAM", "FAM", "FAM", "FAM", "FAM", "FAM", "FAM", "FAM", 
"FAM", "FAM", "FAM", "FAM", "FAM", "FAM", "FAM"), reporter2 = c("VIC", 
"VIC", "VIC", "VIC", "VIC", "VIC", "VIC", "VIC", "VIC", "VIC", 
"VIC", "VIC", "VIC", "VIC", "VIC", "VIC", "VIC", "VIC", "VIC", "VIC"), target1 = c(NA, NA, NA, NA, NA, "EIF4A2", "EIF4A2", "EIF4A2", 
NA, NA, NA, NA, NA, NA, NA, NA, NA, "EIF4A2", "EIF4A2", "EIF4A2"
), target2 = c("GAPDH", "GAPDH", "GAPDH", NA, NA, "ATP5B", "ATP5B", 
"ATP5B", NA, NA, NA, NA, "GAPDH", "GAPDH", "GAPDH", NA, NA, "ATP5B", 
"ATP5B", "ATP5B")), row.names = c(NA, -20L), class = "data.frame")

当前实现(需简化)

data_long <- data %>%
  pivot_longer(cols = starts_with("reporter"),
               names_to = "reporter_n",
               names_prefix = "reporter",
               values_to = "reporter") %>%
  pivot_longer(cols = starts_with("target"),
               names_to = "target_n",
               names_prefix = "target",
               values_to = "target") %>%
  filter(reporter_n == target_n,
         !is.na(target)) %>%
  select(-c(reporter_n, target_n))

目标结果

> head(data_long)
# A tibble: 6 × 3
  well_short reporter target
  <chr>      <chr>    <chr> 
1 A1         VIC      GAPDH 
2 A2         VIC      GAPDH 
3 A3         VIC      GAPDH 
4 A6         FAM      EIF4A2
5 A6         VIC      ATP5B 
6 A7         FAM      EIF4A2

简化方案

方案:用pivot_longer的names_pattern一次性处理

利用正则表达式匹配列名的前缀与数字后缀,同时完成关联列的配对展开,一步到位:

library(tidyr)
library(dplyr)

data_long <- data %>%
  pivot_longer(
    cols = -well_short,
    names_pattern = "(reporter|target)(\\d)",
    names_to = c(".value", "group"),
    values_drop_na = TRUE
  ) %>%
  select(-group)

关键参数说明:

  • names_pattern = "(reporter|target)(\\d)":把列名拆分为两部分,第一部分是前缀(reporter或target),第二部分是数字组号
  • names_to = c(".value", "group"):.value表示保留前缀作为新列名,group暂时存储数字组号(后续可直接删除)
  • values_drop_na = TRUE:直接过滤掉target为NA的行,省去额外过滤步骤

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:25:27