R 两组柱的平行轴

R 两组柱的平行轴,r,pivot,reshape,tidyr,R,Pivot,Reshape,Tidyr,我有以下数据框: 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,

我有以下数据框:

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)
现在我想把这些数据转换成长格式,其中一组是我的V1:V4列,第二组是我的V1\u sum:V4\u sum列。正常的
pivot\u longer
不起作用,因为它只接受一个值列,但是,我需要两个值列

我在tidyverse参考中找到了一个潜在的解决方案(最下面的示例),但我无法定义正确的
names\u模式

有没有一种简单而直接的方法(理想情况下是tidyverse)可以让我只做这两个较长的pivot_集合?感觉这是重塑数据集时的基本任务之一,但我无法让它正常工作

预期产出:

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\u更长(,-Scenario,names\u to=“V”,values\u to=“Value”)%>%
分组依据(方案五)%>%
变异(总和=总和(值))
#A tibble:48 x 4
#分组:方案,V[16]
情景五价值总和
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
#…还有38行

这就是您要寻找的吗?

我在标题为“每行多个观察”的
vignette(“pivot”)
中找到了此解决方案

每一组变量都需要一个并行命名结构,还需要一个分隔符。

在您的情况下(这不是很一般),从
mutate_at
函数中,您可以将
\u sum
附加到每个变量。但是在前四个变量的下划线后面需要一些内容。我用标签
\u orig
重命名了您原来的四个变量,并将求和变量的名称从
V1\u orig\u sum
简化为
V1\u sum
,以避免出现双下划线

dat <- tribble(
  ~Scenario,     ~V1_orig,    ~V2_orig,    ~V3_orig,    ~V4_orig,
  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)

dat_new <- dat %>%
  group_by(Scenario) %>%
  mutate_at(vars(-group_cols()), .funs = list(sum = sum))%>%
  rename(V1_sum=V1_orig_sum, V2_sum=V2_orig_sum, V3_sum=V3_orig_sum, V4_sum=V4_orig_sum)
然后再调用
pivot\u
,但在
names\u to
参数中给它两个列名:一个用于调用这些对象(
Var
,在本例中)和
“.value”
表示应该有尽可能多的新列,
分隔符后面有唯一的标记:

dat_new %>% 
  pivot_longer(-Scenario, 
               names_to = c("Var", ".value"), 
               names_sep="_" )
# A tibble: 48 x 4
# Groups:   Scenario [4]
   Scenario Var    orig   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
dat\u new%>%
透视图,
name_to=c(“Var”,“.value”),
名称\u sep=“\u”)
#A tibble:48 x 4
#分组:方案[4]
情景变量原始和
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
# ... 还有38行

注意:如果将8个变量设置为反向命名系统(即orig_V1、sum_V1等),则可以反转命名参数中的顺序:
names_to=c(“.value”、“Var”)
。此解决方案不要求值的类型相同(即,此处orig和sum均为数字,但其中一个可能为数字,另一个为字符).

哦,天哪……是的,这很有意义,也很有效。但出于好奇。如果我没有原始数据,只是用我的四个V列和四个求和列的预计算版本,不能在原始数据上再应用pivot_?事实上,这是一个非常好的问题……到目前为止,我还没有答案。好吧,我不是一个人。听着ng在TidyVersion引用中,我唯一能做的就是将所有V1:V4列重命名为x1:x4,将所有sum列重命名为y1:y4,并完全应用引用的最后一个示例中的代码(链接在我的帖子中)。但这并不十分优雅。我想这可以归结为找到正确的命名模式,但我失败了。谢谢!是的,对于更结构化的列名,您可以使用.value元素和名称。\u sep。但是,在我的实际使用案例中,我转向创建一个pivot\u longer\u spec数据框()并将其输入到pivot_longer函数中。这比尝试创建可以用上述方法分隔的列名要容易得多,也更具概括性。我当时不知道这个选项,但它确实很有用。
> head(dat_new)
# A tibble: 6 x 9
# Groups:   Scenario [2]
  Scenario V1_orig V2_orig V3_orig V4_orig V1_orig_sum V2_orig_sum V3_orig_sum V4_orig_sum
     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>       <dbl>       <dbl>       <dbl>       <dbl>
1        1    0.97    0.46    0.79    0.25        3.06        2.67        1.32        2.35
2        1    0.21    0.45    0.23    0.63        3.06        2.67        1.32        2.35
3        1    0.95    0.97    0.07    0.61        3.06        2.67        1.32        2.35
4        1    0.93    0.79    0.23    0.86        3.06        2.67        1.32        2.35
5        2    0.22    0.01    0.42    0.47        0.93        0.18        0.58        1.35
6        2    0.71    0.17    0.16    0.88        0.93        0.18        0.58        1.35
dat_new %>% 
  pivot_longer(-Scenario, 
               names_to = c("Var", ".value"), 
               names_sep="_" )
# A tibble: 48 x 4
# Groups:   Scenario [4]
   Scenario Var    orig   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