jba*_*ura 11 r tidyr tidyverse tibble
我正在尝试使用pivot_longer来延长我的数据框,但我不需要它很长,并且希望输出多个“值”列。
\n例子:
\ndf <- 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\nRun Code Online (Sandbox Code Playgroud)\n我想要的输出是:
\ndf2 <- 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\nRun Code Online (Sandbox Code Playgroud)\n到目前为止,我已经尝试了多个后续的pivot_longer(),unique()但这搞乱了输出:
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\nRun Code Online (Sandbox Code Playgroud)\n我有点明白为什么 - 行被重复太多次,因此没有为每行保留组标识。但是,我很难找到解决方案。我知道有一个names_pattern选项,但我不确定它在这种情况下如何应用。
任何帮助将非常感激!我考虑过转为全长格式(即为每个“平均值”、“se”等设置一个“测量”列),然后用于pivot_wider()转为我需要的格式,但我也无法弄清楚知道如何做到这一点。另外,如果需要更多信息,请告诉我。我的实际数据集处理4种不同的测量(相同格式,即measurement.group)和数千种蛋白质,但原理应该是相同的,我希望!
akr*_*run 15
names_to如果我们将 指定为值向量,.value即返回列的值并使用列名称的后缀对列进行“分组”,则不需要多次调用。在这里,我们使用names_sepas.进行分割.
library(tidyr)\npivot_longer(df, cols = -ids, names_to = c(".value", "group"), \n names_sep = "\\\\.")\nRun 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\nRun Code Online (Sandbox Code Playgroud)\nsample注意:值与创建输入数据时使用的值不同,没有set.seed指定