有没有办法 pivot_longer 到 R 中的多个值列?
Is there way to pivot_longer to multiple values columns in R?
我正在尝试使用 pivot_longer 来延长我的数据框,但我不需要它很长,并且想输出多个“值”列。
示例:
df <- tibble(
ids = c("protein1", "protein2"),
mean.group1 = sample(1:1000, 2),
mean.group2 = sample(1:1000, 2),
se.group1 = sample(1:10, 2),
se.group2 = sample(1:10, 2)
)
df
# A tibble: 2 × 5
ids mean.group1 mean.group2 se.group1 se.group2
<chr> <int> <int> <int> <int>
1 protein1 763 456 6 4
2 protein2 820 624 4 7
我想要的输出是:
df2 <- tibble(
ids = c("protein1", "protein1", "protein2", "protein2"),
mean = c(df$mean.group1[1], df$mean.group2[1], df$mean.group1[2], df$mean.group2[2]),
se = c(df$se.group1[1], df$se.group2[1], df$se.group1[2], df$se.group2[2]),
group = c("group1", "group2", "group1", "group2")
)
df2
# A tibble: 4 × 4
ids mean se group
<chr> <int> <int> <chr>
1 protein1 763 6 group1
2 protein1 456 4 group2
3 protein2 820 4 group1
4 protein2 624 7 group2
到目前为止,我已经尝试了多个后续的 pivot_longer()
,然后是 unique()
,但这弄乱了输出:
df_longer <- df %>%
pivot_longer(cols = starts_with("mean."),
names_to = "group",
names_prefix = "mean.",
values_to = "mean") %>%
unique() %>%
pivot_longer(cols = starts_with("se."),
names_to = "group",
names_prefix = "se.",
values_to = "se",
names_repair = "unique") %>%
unique()
df_longer
# A tibble: 8 × 5
ids group...2 mean group...4 se
<chr> <chr> <int> <chr> <int>
1 protein1 group1 763 group1 6
2 protein1 group1 763 group2 4
3 protein1 group2 456 group1 6
4 protein1 group2 456 group2 4
5 protein2 group1 820 group1 4
6 protein2 group1 820 group2 7
7 protein2 group2 624 group1 4
8 protein2 group2 624 group2 7
我有点理解为什么 - 行被复制了太多次,因此没有为每一行保留组标识。但是,我无法提出解决方案。我知道有一个 names_pattern
选项,但我不确定它在这种情况下如何应用。
如有任何帮助,我们将不胜感激!我考虑过转向全长格式(即每个 'mean'、'se' 等都有一个“测量”列),然后使用 pivot_wider()
转向我需要的格式,但是我也一直无法弄清楚该怎么做。另外,如果需要更多信息,请告诉我。我的实际数据集处理 4 种不同的测量(相同格式,即 measurement.group)和数千种蛋白质,但我希望原理应该相同!
如果我们将 names_to
指定为值向量,即 .value
- returns 列的值和 'group'带有列名后缀的列。在这里,我们使用 names_sep
作为 .
在 .
处拆分
library(tidyr)
pivot_longer(df, cols = -ids, names_to = c(".value", "group"),
names_sep = "\.")
-输出
# A tibble: 4 × 4
ids group mean se
<chr> <chr> <int> <int>
1 protein1 group1 982 3
2 protein1 group2 657 7
3 protein2 group1 663 9
4 protein2 group2 215 1
注意:值不同,因为 sample
用于创建输入数据而没有指定 set.seed
我正在尝试使用 pivot_longer 来延长我的数据框,但我不需要它很长,并且想输出多个“值”列。
示例:
df <- tibble(
ids = c("protein1", "protein2"),
mean.group1 = sample(1:1000, 2),
mean.group2 = sample(1:1000, 2),
se.group1 = sample(1:10, 2),
se.group2 = sample(1:10, 2)
)
df
# A tibble: 2 × 5
ids mean.group1 mean.group2 se.group1 se.group2
<chr> <int> <int> <int> <int>
1 protein1 763 456 6 4
2 protein2 820 624 4 7
我想要的输出是:
df2 <- tibble(
ids = c("protein1", "protein1", "protein2", "protein2"),
mean = c(df$mean.group1[1], df$mean.group2[1], df$mean.group1[2], df$mean.group2[2]),
se = c(df$se.group1[1], df$se.group2[1], df$se.group1[2], df$se.group2[2]),
group = c("group1", "group2", "group1", "group2")
)
df2
# A tibble: 4 × 4
ids mean se group
<chr> <int> <int> <chr>
1 protein1 763 6 group1
2 protein1 456 4 group2
3 protein2 820 4 group1
4 protein2 624 7 group2
到目前为止,我已经尝试了多个后续的 pivot_longer()
,然后是 unique()
,但这弄乱了输出:
df_longer <- df %>%
pivot_longer(cols = starts_with("mean."),
names_to = "group",
names_prefix = "mean.",
values_to = "mean") %>%
unique() %>%
pivot_longer(cols = starts_with("se."),
names_to = "group",
names_prefix = "se.",
values_to = "se",
names_repair = "unique") %>%
unique()
df_longer
# A tibble: 8 × 5
ids group...2 mean group...4 se
<chr> <chr> <int> <chr> <int>
1 protein1 group1 763 group1 6
2 protein1 group1 763 group2 4
3 protein1 group2 456 group1 6
4 protein1 group2 456 group2 4
5 protein2 group1 820 group1 4
6 protein2 group1 820 group2 7
7 protein2 group2 624 group1 4
8 protein2 group2 624 group2 7
我有点理解为什么 - 行被复制了太多次,因此没有为每一行保留组标识。但是,我无法提出解决方案。我知道有一个 names_pattern
选项,但我不确定它在这种情况下如何应用。
如有任何帮助,我们将不胜感激!我考虑过转向全长格式(即每个 'mean'、'se' 等都有一个“测量”列),然后使用 pivot_wider()
转向我需要的格式,但是我也一直无法弄清楚该怎么做。另外,如果需要更多信息,请告诉我。我的实际数据集处理 4 种不同的测量(相同格式,即 measurement.group)和数千种蛋白质,但我希望原理应该相同!
如果我们将 names_to
指定为值向量,即 .value
- returns 列的值和 'group'带有列名后缀的列。在这里,我们使用 names_sep
作为 .
在 .
library(tidyr)
pivot_longer(df, cols = -ids, names_to = c(".value", "group"),
names_sep = "\.")
-输出
# A tibble: 4 × 4
ids group mean se
<chr> <chr> <int> <int>
1 protein1 group1 982 3
2 protein1 group2 657 7
3 protein2 group1 663 9
4 protein2 group2 215 1
注意:值不同,因为 sample
用于创建输入数据而没有指定 set.seed