我有以下数据框:
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 集?感觉这是 reshape 数据集时的基本任务之一,但我无法让它工作。
预期输出:
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”只是示例,如果其他列名更容易即时生成,我也可以。
最佳答案
也许你应该在计算总和之前尝试旋转:
dat %>% pivot_longer(., -Scenario, names_to = "V", values_to = "Value") %>%
group_by(Scenario, V) %>%
mutate(Sum = sum(Value))
# A tibble: 48 x 4
# Groups: Scenario, V [16]
Scenario V Value Sum
<dbl> <chr> <dbl> <dbl>
1 1 V1 0.97 3.06
2 1 V2 0.46 2.67
3 1 V3 0.79 1.32
4 1 V4 0.25 2.35
5 1 V1 0.21 3.06
6 1 V2 0.45 2.67
7 1 V3 0.23 1.32
8 1 V4 0.63 2.35
9 1 V1 0.95 3.06
10 1 V2 0.97 2.67
# … with 38 more rows
这是您要找的吗?
关于r - 两组列的平行 pivot_longer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59253987/