tidyr::pivot_longer 到多列

tidyr::pivot_longer to multiple columns

我需要将数据框转换为更长的格式。例如,我的数据框会像

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

我需要将其转换为

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)
) 

我想使用 tidyr::pivot_longer 但在这里找不到 names_pattern。我在正确的轨道上吗?

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

有什么帮助吗?谢谢

您可以在 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

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

第一个捕获组 ([a-zA-Z]+) 从列名中捕获所有字母表,即 x 来自 x1x 来自 x2y 来自 y1 等等。正如我在正则表达式中使用 + 一样,如果您的列名超过 1 个字符(例如 - col1col2 等),它也将起作用。第二个捕获组用于从列名中捕获数字,即 1 来自 x12 来自 x2 等等。

我们可以将 names_sep 与正则表达式一起使用

library(tidyr)
pivot_longer(df, cols = -group, names_to = c(".value", "num"),
     names_sep = "(?<=[a-z])(?=\d)")
# A tibble: 4 x 4
  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

这也是解决这个problem.using聚散散函数的方法

      df%>%
       gather(num,"x1","x2","y1","y2",-(group),value = 
       values)%>%
       separate(num,into=c("var",'val'),sep=1)%>%
       spread(key='var',value=values)

这是使用 reshape

的基础 R 选项
reshape(
  setNames(df, gsub("(\d+)$", ".\1", names(df))),
  direction = "long",
  idvar = "group",
  varying = -1,
  timevar = "n"
)

这给出了

          group n x  y
group1.1 group1 1 3  7
group2.1 group2 1 4  8
group1.2 group1 2 5  9
group2.2 group2 2 6 10