我需要将数据帧转换为更长的形式。例如,我的数据框将是这样的
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)
有什么帮助吗?谢谢。
您可以将正则表达式传递给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 x1、xfrom x2、yfromy1等。正如我在正则表达式中使用的那样,+如果您的列名称超过 1 个字符(例如 - 等),它也将col1起作用col2。第二个捕获组用于捕获列名称中的数字,即1from x1、2fromx2等。