tidyr::pivot_longer 到多列

ds_*_*ton 3 r tidyr

我需要将数据帧转换为更长的形式。例如,我的数据框将是这样的

df <- data.frame(
  group = c("group1","group2"),
  x1 = c(3,4),
  x2 = c(5,6),
  y1 = c(7,8),
  y2 = c(9,10)
)
Run Code Online (Sandbox Code Playgroud)

我需要将其转换为

df2 <- data.frame(
  group = c("group1","group1","group2","group2"),
  num = c(1,2,1,2),
  x = c(3,5,4,6),
  y = c(7,9,8,10)
) 
Run Code Online (Sandbox Code Playgroud)

我想使用 tidyr::pivot_longer 但无法在这里找出 names_pattern 。我走在正确的轨道上吗?

df_2<-df%>%tidyr::pivot_longer(c("x1","x2","y1","y2"),
                               names_to = c("x","y"),
                               names_pattern = "")
Run Code Online (Sandbox Code Playgroud)

有什么帮助吗?谢谢。

Ron*_*hah 5

您可以将正则表达式传递给names_pattern-

tidyr::pivot_longer(df,cols = -group, 
                    names_to = c('.value', 'num'), 
                    names_pattern = '([a-zA-Z]+)(\\d+)')

#  group  num       x     y
#  <chr>  <chr> <dbl> <dbl>
#1 group1 1         3     7
#2 group1 2         5     9
#3 group2 1         4     8
#4 group2 2         6    10
Run Code Online (Sandbox Code Playgroud)

.value具有特殊含义pivot_longer,表明原始数据帧中的部分列名称将是输出数据帧的列名称。该部分是使用names_pattern参数决定的,该参数以捕获组的形式提供正则表达式模式。

第一个捕获组([a-zA-Z]+)捕获列名称中的所有字母,即xfrom x1xfrom x2yfromy1等。正如我在正则表达式中使用的那样,+如果您的列名称超过 1 个字符(例如 - 等),它也将col1起作用col2。第二个捕获组用于捕获列名称中的数字,即1from x12fromx2等。