有没有办法在 R 中将数据透视_更长到多个值列?

jba*_*ura 11 r tidyr tidyverse tibble

我正在尝试使用pivot_longer来延长我的数据框,但我不需要它很长,并且希望输出多个“值”列。

\n

例子:

\n
df <- tibble(\n  ids = c("protein1", "protein2"),\n  mean.group1 = sample(1:1000, 2),\n  mean.group2 = sample(1:1000, 2),\n  se.group1 = sample(1:10, 2),\n  se.group2 = sample(1:10, 2)\n)\n\ndf\n# A tibble: 2 \xc3\x97 5\n  ids      mean.group1 mean.group2 se.group1 se.group2\n  <chr>          <int>       <int>     <int>     <int>\n1 protein1         763         456         6         4\n2 protein2         820         624         4         7\n
Run Code Online (Sandbox Code Playgroud)\n

我想要的输出是:

\n
df2 <- tibble(\n  ids = c("protein1", "protein1", "protein2", "protein2"),\n  mean = c(df$mean.group1[1], df$mean.group2[1], df$mean.group1[2], df$mean.group2[2]),\n  se = c(df$se.group1[1], df$se.group2[1], df$se.group1[2], df$se.group2[2]),\n  group = c("group1", "group2", "group1", "group2")\n)\n\ndf2\n\n# A tibble: 4 \xc3\x97 4\n  ids       mean    se group \n  <chr>    <int> <int> <chr> \n1 protein1   763     6 group1\n2 protein1   456     4 group2\n3 protein2   820     4 group1\n4 protein2   624     7 group2\n
Run Code Online (Sandbox Code Playgroud)\n

到目前为止,我已经尝试了多个后续的pivot_longer()unique()但这搞乱了输出:

\n
df_longer <- df %>%\n  pivot_longer(cols = starts_with("mean."),\n               names_to = "group",\n               names_prefix = "mean.",\n               values_to = "mean") %>%\n  unique() %>%\n  pivot_longer(cols = starts_with("se."),\n               names_to = "group",\n               names_prefix = "se.",\n               values_to = "se",\n               names_repair = "unique") %>%\n  unique()\n\ndf_longer\n\n# A tibble: 8 \xc3\x97 5\n  ids      group...2  mean group...4    se\n  <chr>    <chr>     <int> <chr>     <int>\n1 protein1 group1      763 group1        6\n2 protein1 group1      763 group2        4\n3 protein1 group2      456 group1        6\n4 protein1 group2      456 group2        4\n5 protein2 group1      820 group1        4\n6 protein2 group1      820 group2        7\n7 protein2 group2      624 group1        4\n8 protein2 group2      624 group2        7\n
Run Code Online (Sandbox Code Playgroud)\n

我有点明白为什么 - 行被重复太多次,因此没有为每行保留组标识。但是,我很难找到解决方案。我知道有一个names_pattern选项,但我不确定它在这种情况下如何应用。

\n

任何帮助将非常感激!我考虑过转为全长格式(即为每个“平均值”、“se”等设置一个“测量”列),然后用于pivot_wider()转为我需要的格式,但我也无法弄清楚知道如何做到这一点。另外,如果需要更多信息,请告诉我。我的实际数据集处理4种不同的测量(相同格式,即measurement.group)和数千种蛋白质,但原理应该是相同的,我希望!

\n

akr*_*run 15

names_to如果我们将 指定为值向量,.value即返回列的值并使用列名称的后缀对列进行“分组”,则不需要多次调用。在这里,我们使用names_sepas.进行分割.

\n
library(tidyr)\npivot_longer(df, cols  = -ids, names_to = c(".value", "group"), \n    names_sep = "\\\\.")\n
Run Code Online (Sandbox Code Playgroud)\n

-输出

\n
# A tibble: 4 \xc3\x97 4\n  ids      group   mean    se\n  <chr>    <chr>  <int> <int>\n1 protein1 group1   982     3\n2 protein1 group2   657     7\n3 protein2 group1   663     9\n4 protein2 group2   215     1\n
Run Code Online (Sandbox Code Playgroud)\n

sample注意:值与创建输入数据时使用的值不同,没有set.seed指定

\n