两组列的平行ivot_longer

问题描述 投票:0回答:1

我有以下数据框:

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_patternhttps://tidyr.tidyverse.org/reference/pivot_longer.html

是否有一种简单明了的方式(最好是tidyverse),在这里我可以做这两个pivot_longer集?感觉这是重塑数据集时的基本任务之一,但我无法使其正常工作。

预期输出:

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”仅是示例,如果其他列名更容易即时生成,我也很满意。

我有以下数据框:library(tidyverse)dat

r pivot tidyverse reshape
1个回答
0
投票

也许您应该在计算总和之前尝试进行透视:

dat %>% group_by(Scenario) %>% 
        pivot_longer(., -Scenario, names_to = "V", values_to = "Value") %>%
        mutate(Sum = sum(Value))

# A tibble: 48 x 4
# Groups:   Scenario [4]
   Scenario V     Value   Sum
      <dbl> <chr> <dbl> <dbl>
 1        1 V1     0.97   9.4
 2        1 V2     0.46   9.4
 3        1 V3     0.79   9.4
 4        1 V4     0.25   9.4
 5        1 V1     0.21   9.4
 6        1 V2     0.45   9.4
 7        1 V3     0.23   9.4
 8        1 V4     0.63   9.4
 9        1 V1     0.95   9.4
10        1 V2     0.97   9.4
# … with 38 more rows
© www.soinside.com 2019 - 2024. All rights reserved.