首页 > 解决方案 > 多个变量的 Pivot_longer

问题描述

我正在尝试整理几个样本中已识别肽序列的数据框:

Sample_Elu_HN, Sample_LW_HN, Sample_Elu_HM, Sample_LW_HM, Sample_Elu_M1, Sample_LW_M1, Sample_Elu_M2, Sample_LW_M2, Sample_Elu_N1, Sample_LW_N1, Sample_Elu_N2, Sample_LW_N2, 和Control_Preload_None.

数据框包含每个肽的信息,包括它们在每个样本中的丰度,以及其识别的可信度。

names <- c("Sequence", "Modifications", "Master Protein Accessions","Missed Cleavages",
           "Abundance: Mean: Control, None, Preload","Abundance: SD: Control, None, Preload","Abundance: CV: Control, None, Preload",
           "Abundance: Mean: Sample, HM, Elu","Abundance: SD: Sample, HM, Elu","Abundance: CV: Sample, HM, Elu",
           "Abundance: Mean: Sample, HN, Elu","Abundance: SD: Sample, HN, Elu","Abundance: CV: Sample, HN, Elu",
           "Abundance: Mean: Sample, M1, Elu","Abundance: SD: Sample, M1, Elu","Abundance: CV: Sample, M1, Elu",
           "Abundance: Mean: Sample, M2, Elu","Abundance: SD: Sample, M2, Elu","Abundance: CV: Sample, M2, Elu",
           "Abundance: Mean: Sample, N1, Elu","Abundance: SD: Sample, N1, Elu","Abundance: CV: Sample, N1, Elu",
           "Abundance: Mean: Sample, N2, Elu","Abundance: SD: Sample, N2, Elu","Abundance: CV: Sample, N2, Elu",
           "Abundance: Mean: Sample, HM, LW","Abundance: SD: Sample, HM, LW","Abundance: CV: Sample, HM, LW",
           "Abundance: Mean: Sample, HN, LW","Abundance: SD: Sample, HN, LW","Abundance: CV: Sample, HN, LW",
           "Abundance: Mean: Sample, M1, LW","Abundance: SD: Sample, M1, LW","Abundance: CV: Sample, M1, LW",
           "Abundance: Mean: Sample, M2, LW","Abundance: SD: Sample, M2, LW","Abundance: CV: Sample, M2, LW",
           "Abundance: Mean: Sample, N1, LW","Abundance: SD: Sample, N1, LW","Abundance: CV: Sample, N1, LW",
           "Abundance: Mean: Sample, N2, LW","Abundance: SD: Sample, N2, LW","Abundance: CV: Sample, N2, LW",
           "Found in Sample Group: Control, Preload, None","Found in Sample Group: Sample, Elu, HM",
           "Found in Sample Group: Sample, Elu, HN","Found in Sample Group: Sample, Elu, M1",
           "Found in Sample Group: Sample, Elu, M2","Found in Sample Group: Sample, Elu, N1",
           "Found in Sample Group: Sample, Elu, N2","Found in Sample Group: Sample, LW, HM",
           "Found in Sample Group: Sample, LW, HN","Found in Sample Group: Sample, LW, M1",
           "Found in Sample Group: Sample, LW, M2","Found in Sample Group: Sample, LW, N1",
           "Found in Sample Group: Sample, LW, N2")
peptide1 <- c("FQSEEQQQTEDELQDK","1xPhospho [S3(100)]","P02666",0,591079706.5,129831141.4,21.96508186,92078374.7,5559797.773,6.038114585,130764801.6,11101742.04,8.489854991,304661843.6,89701289.78,29.44290257,100024065.8,174405.3367,0.174363375,20777445.26,7953029.115,38.27722329,43696929.72,10030935.24,22.95569805,496031039,260945694.4,52.60672697,111323285.3,32961482.23,29.60879402,329268465.6,243189584.2,73.85753864,478737037.1,153121463.4,31.98446151,701372889.6,20000942.58,2.851684585,847417746,84344510.23,9.953120599,"High","High","High","High","High","High","High","High","High","Found","High","High","High")
peptide2 <- c("HPGDFGADAQGAMTK","1xPhospho [H1(100)]","P68082",0,295017576,49088902.73,16.63931464,2845912.875,709262.9265,24.92215882,3659951.5,215619.485,5.891320828,41946172,301640.4391,0.719113151,9336196.75,1507110.776,16.14266298,1469308.375,434213.7682,29.55225572,1607320,498424.3673,31.00965379,191151516,137956380.3,72.17121954,236416096,97608884.31,41.28690303,119327816,55998433.41,46.92823123,152802424,9555841.041,6.253723462,147086456,33874815.85,23.03054732,255244232,75472108.91,29.56858548,"High","High","High","High","High","High","High","High","High","Not Found","High","Not Found","High")
peptide3 <- c("IEKFQSEEQQQTEDELQDK","","P02666",1,75099003,12104439.14,16.11797582,18015945.88,6770542.657,37.58083369,7913736.75,4197999.975,53.04700053,46005954.5,8581332.638,18.65265645,14313846.5,4426286.925,30.92311298,5085692.75,528187.9059,10.38576123,7676983.313,3681526.619,47.95538129,24546758.5,13126407.14,53.47511419,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,9098671.051,22.39353163,31170934,NA,NA,"High","High","High","High","High","High","High","Not Found","Not Found","Not Found","High","Not Found","High")

example.data <- as.data.frame(rbind(peptide1, peptide2, peptide3))
colnames(example.data) <- names
example.data

我想要的是将"Abundance: Mean: ...",和列收集到"Abundance: SD: ...",和."Abundance: CV:...""Found in Sample Group: ...""Mean""SD""CV""Found"

这是我尝试过的:

library(tidyr)
example.tidy <- pivot_longer(example.data, cols = c(str_which(colnames(example.data), "Abundance: [^F]"), str_which(colnames(example.data), "Found in Sample Group")),
                             names_to = c(".value", "Sample", "Polymer", "Fraction"), names_pattern = "(.*): (.*), (.*), (.*)")

但是,它将平均值、SD 和 CV 值与 Found 值分隔在不同的行中,留下很多 NA 值......

需要修复什么以使所有变量的所有值都包含在同一行中?

一如既往地感谢您的帮助!

标签: rdplyrtidyr

解决方案


您需要将要堆叠的名称更改为单个模式。

library(dplyr)
library(tidyr)

example.data %>%
  rename_with(~ sub(".+?:\\s", "", .), starts_with("Abundance")) %>%
  rename_with(~ sub(".+:(.+),(.+),(.+)", "Found:\\1,\\3,\\2", .), starts_with("Found")) %>% 
  pivot_longer(-(1:4), names_to = c(".value", "Set"), names_sep = ":\\s") %>%
  separate(Set, c("Sample", "Polymer", "Fraction"))

# # A tibble: 39 x 11
#    Sequence       Modifications      `Master Protein Accessi… `Missed Cleavages` Sample Polymer Fraction Mean      SD        CV        Found
#    <chr>          <chr>              <chr>                    <chr>              <chr>  <chr>   <chr>    <chr>     <chr>     <chr>     <chr>
#  1 FQSEEQQQTEDEL… 1xPhospho [S3(100… P02666                   0                  Contr… None    Preload  59107970… 12983114… 21.96508… High 
#  2 FQSEEQQQTEDEL… 1xPhospho [S3(100… P02666                   0                  Sample HM      Elu      92078374… 5559797.… 6.038114… High 
#  3 FQSEEQQQTEDEL… 1xPhospho [S3(100… P02666                   0                  Sample HN      Elu      13076480… 11101742… 8.489854… High 
#  4 FQSEEQQQTEDEL… 1xPhospho [S3(100… P02666                   0                  Sample M1      Elu      30466184… 89701289… 29.44290… High 
#  5 FQSEEQQQTEDEL… 1xPhospho [S3(100… P02666                   0                  Sample M2      Elu      10002406… 174405.3… 0.174363… High 
#  6 FQSEEQQQTEDEL… 1xPhospho [S3(100… P02666                   0                  Sample N1      Elu      20777445… 7953029.… 38.27722… High 
#  7 FQSEEQQQTEDEL… 1xPhospho [S3(100… P02666                   0                  Sample N2      Elu      43696929… 10030935… 22.95569… High 
#  8 FQSEEQQQTEDEL… 1xPhospho [S3(100… P02666                   0                  Sample HM      LW       496031039 26094569… 52.60672… High 
#  9 FQSEEQQQTEDEL… 1xPhospho [S3(100… P02666                   0                  Sample HN      LW       11132328… 32961482… 29.60879… High 
# 10 FQSEEQQQTEDEL… 1xPhospho [S3(100… P02666                   0                  Sample M1      LW       32926846… 24318958… 73.85753… Found
# # … with 29 more rows

您的数据中有一个陷阱。那些以 开头的列Found应该重命名以匹配其他列的模式。例如

Found in Sample Group: Sample, Elu, HM

应该改名为

Found in Sample Group: Sample, HM, Elu

等等。


推荐阅读