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