stu*_*123 4 pivot r dplyr tidyr tidyverse
我想在数据框中旋转多组变量。我的数据如下所示:
require(dplyr)
require(tidyr)
x_1=rnorm(10,0,1)
x_2=rnorm(10,0,1)
x_3=rnorm(10,0,1)
y_1=rnorm(10,0,1)
y_2=rnorm(10,0,1)
aid=rep(1:5,2)
data=data.frame(aid, x_1,x_2,y_1,y_2)
> data
aid x_1 x_2 y_1 y_2
1 1 -0.82305819 0.9366731 0.95419200 2.29544019
2 2 0.64424320 -0.2807793 0.51303834 0.02560463
3 3 -1.11108822 -0.2475625 0.05747951 -0.51218368
4 4 -1.04026895 -0.4138653 0.57751999 0.60942652
5 5 1.29097040 -1.7829966 1.59940532 0.75868562
6 1 -0.57845406 -1.0002074 0.04302291 0.86766265
7 2 0.08996163 -0.7949632 -2.10422124 -0.43432995
8 3 0.14331978 0.4203010 -1.12748270 0.14484670
9 4 -0.25207187 1.5559295 0.23621422 -0.04719046
10 5 -0.25617731 0.6241852 -1.21131110 1.02236458
Run Code Online (Sandbox Code Playgroud)
我想分别旋转 x 和 y 变量。我使用以下代码行做到了这一点。
data2 = data %>% reshape(.,direction = "long",
varying = list(c('x_1','x_2'),
c('y_1','y_2')),
v.names = c("x",'y'))
Run Code Online (Sandbox Code Playgroud)
我需要将其推广到任意数量的列。这意味着,在此示例中,x 和 y 各有 2 列。但对于另一个数据集可能会有所不同。如果有更多列,则很难在varying参数下键入所有内容。
为了避免在旋转时指定列,我尝试了以下代码:
data1 <- data%>% pivot_longer(!aid, names_to = c("id"), names_pattern = "(.)(.)")
Run Code Online (Sandbox Code Playgroud)
但它给出了这个错误:
Error: `regex` should define 1 groups; found.
Run Code Online (Sandbox Code Playgroud)
谁能帮我解决这个问题吗?
谢谢。
匹配模式周围的括号表示我们正在将该模式捕获为一个组。在下面的代码中,我们捕获一个或多个小写字母 ( [a-z]+) 后跟 a _(不在括号内,因此它被删除),第二个捕获组匹配一个或多个数字 ( \\\\d+),这将与对应的值names_to- 即.value表示列的值,因此我们得到列 'x' 和 'y' 的值,第二个将是一个新的列名称,它返回列名称的后缀数字,即 'time'
library(tidyr)\npivot_longer(data, cols = -aid, names_to = c(".value", "time"), \n names_pattern = "^([a-z]+)_(\\\\d+)")\nRun Code Online (Sandbox Code Playgroud)\n-输出
\n# A tibble: 20 \xc3\x97 4\n aid time x y\n <int> <chr> <dbl> <dbl>\n 1 1 1 -0.823 0.954 \n 2 1 2 0.937 2.30 \n 3 2 1 0.644 0.513 \n 4 2 2 -0.281 0.0256\n 5 3 1 -1.11 0.0575\n 6 3 2 -0.248 -0.512 \n 7 4 1 -1.04 0.578 \n 8 4 2 -0.414 0.609 \n 9 5 1 1.29 1.60 \n10 5 2 -1.78 0.759 \n11 1 1 -0.578 0.0430\n12 1 2 -1.00 0.868 \n13 2 1 0.0900 -2.10 \n14 2 2 -0.795 -0.434 \n15 3 1 0.143 -1.13 \n16 3 2 0.420 0.145 \n17 4 1 -0.252 0.236 \n18 4 2 1.56 -0.0472\n19 5 1 -0.256 -1.21 \n20 5 2 0.624 1.02 \nRun Code Online (Sandbox Code Playgroud)\n在OP的代码中,有两组((.)和(.)),并且 中只有一个元素names_to,因此由于_“x”、“y”和数字之间存在这一事实,它失败了。另外,默认情况下,names_pattern将处于正则表达式模式,因此某些字符处于metacharacter模式 ie.代表任何character而不是文字.
| 归档时间: |
|
| 查看次数: |
1290 次 |
| 最近记录: |