【发布时间】:2020-04-02 20:35:42
【问题描述】:
我有以下数据框:
library(tidyverse)
dat <- tribble(
~Scenario, ~V1, ~V2, ~V3, ~V4,
1, 0.97, 0.46, 0.79, 0.25,
1, 0.21, 0.45, 0.23, 0.63,
1, 0.95, 0.97, 0.07, 0.61,
1, 0.93, 0.79, 0.23, 0.86,
2, 0.22, 0.01, 0.42, 0.47,
2, 0.71, 0.17, 0.16, 0.88,
3, 0.73, 0.38, 0.10, 0.77,
3, 0.49, 0.37, 0.90, 0.52,
3, 0.99, 0.71, 0.66, 0.05,
3, 0.72, 0.75, 0.69, 0.01,
3, 0.15, 0.87, 0.12, 0.02,
4, 0.94, 0.30, 0.91, 0.99)
我正在向该数据添加四个新列,其中每个新列代表按 Scenario 分组的每个 V1:V4 列的总和:
dat_new <- dat %>%
group_by(Scenario) %>%
mutate_at(vars(-group_cols()), .funs = list(sum = sum))
现在我想将这些数据转换为长格式,其中一组是我的 V1:V4 列,第二组是我的 V1_sum:V4_sum 列。普通的pivot_longer 不起作用,因为它只接受一个值列,但是,我需要两个。
我在 tidyverse 参考资料(最底部的示例)中找到了一个潜在的解决方案,但我未能定义正确的 names_pattern。 https://tidyr.tidyverse.org/reference/pivot_longer.html
有没有一种简单直接的方法(理想情况下是 tidyverse),我可以只做这两个 pivot_longer 集?感觉这是reshaping数据集时的基本任务之一,但是我无法让它工作。
预期输出:
Scenario set V sum
1 1 0.97 3.06
1 2 0.46 2.67
1 3 0.79 1.32
1 4 0.25 2.35
...
4 4 0.99 0.99
注意:列名“set”、“V”和“sum”只是示例,如果是其他列名,我也可以更容易即时生成。
【问题讨论】: