我需要将数据框转换为更长的格式。例如,我的数据框会像
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
.value
在 pivot_longer
中有特殊含义,这表明原始数据帧中的部分列名将是输出数据帧的列名。该部分使用 names_pattern
参数决定,该参数以捕获组的形式提供正则表达式模式。
第一个捕获组 ([a-zA-Z]+)
从列名中捕获所有字母,即 x
来自 x1
,x2
中的 x
,y1
中的 y
等等。因为我在正则表达式中使用了 +
,所以如果您的列名超过 1 个字符(例如 - col1
、col2
),它也会起作用ETC。)。第二个捕获组用于从列名中捕获数字,即 1
来自 x1
,2
来自 x2
等等。
https://stackoverflow.com/questions/68101083/