在R中使用pivot_longer旋转多组列

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)

谁能帮我解决这个问题吗?

谢谢。

akr*_*run 7

匹配模式周围的括号表示我们正在将该模式捕获为一个组。在下面的代码中,我们捕获一个或多个小写字母 ( [a-z]+) 后跟 a _(不在括号内,因此它被删除),第二个捕获组匹配一个或多个数字 ( \\\\d+),这将与对应的值names_to- 即.value表示列的值,因此我们得到列 'x' 和 'y' 的值,第二个将是一个新的列名称,它返回列名称的后缀数字,即 'time'

\n
library(tidyr)\npivot_longer(data, cols = -aid, names_to = c(".value", "time"), \n    names_pattern = "^([a-z]+)_(\\\\d+)")\n
Run 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  \n
Run Code Online (Sandbox Code Playgroud)\n
\n

在OP的代码中,有两组((.)(.)),并且 中只有一个元素names_to,因此由于_“x”、“y”和数字之间存在这一事实,它失败了。另外,默认情况下,names_pattern将处于正则表达式模式,因此某些字符处于metacharacter模式 ie.代表任何character而不是文字.

\n