r - tidyr::pivot_longer 到多列

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

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 来自 x1x2 中的 xy1 中的 y 等等。因为我在正则表达式中使用了 +,所以如果您的列名超过 1 个字符(例如 - col1col2),它也会起作用ETC。)。第二个捕获组用于从列名中捕获数字,即 1 来自 x12 来自 x2等等。

https://stackoverflow.com/questions/68101083/

相关文章:

awk - 列出唯一并计算字符串后的第一个数字匹配

debugging - 在 WebStorm 中调试 hardhat solidity 测试

bash - 在 bash 中,如何将 "set -x"行打印到标准输出而不是标准错误?

python - 在一行中将数​​字减半

javascript - 如何对任意数量的变量运行一种方法

c# - 如何在 Index.razor 页面上为 Blazor 使用谷歌字体

java - Kotlin Any 类型到 Java Object 类型

next.js - Next js中具有多个参数的动态路由 - 文件结构

node.js - nvm:无法安装 v8.6.0,需要安装旧版本的 nodejs 无法安装,(ma

r - 使用 mutate 创建行而不是列