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