dplyr - 使用列名中的字段集创建新列
dplyr - creating new column with field set from column name
我有一个相当混乱的数据框,列名类似于
colnames(df) <- c("X1", "X2", "X3", "Y1", "Y2", "Y3")
我想更长时间地创建一个包含三列的数据框,使用 pivot_longer
,其中 X 和 Y 各有一列,第三列(称为“运行”)包含 1 ,2 或 3 取决于上面的列名。
Pivot_longer
似乎是要使用的函数,但我不确定如何使用它来动态创建 2 个名为 X 和 Y 的列,取自列名,并从列名中提取第三列的值还。
有人知道怎么做吗?值得注意的是,实际的 df 有许多不同的列名,因此不可能强制命名新列。
感谢您的帮助!
您可以使用 pivot_longer
在 names_pattern
中指定正则表达式。
df <- data.frame(X1 = rnorm(5), X2 = rnorm(5), Y1 = rnorm(5), Y2 = rnorm(5))
tidyr::pivot_longer(df,
everything(),
names_to = c('.value', 'run'),
names_pattern = '([A-Z])(\d+)')
# run X Y
# <chr> <dbl> <dbl>
# 1 1 0.376 -1.73
# 2 2 -0.497 1.24
# 3 1 0.310 -2.20
# 4 2 0.0114 0.783
# 5 1 0.00501 0.543
# 6 2 0.00986 0.0481
# 7 1 -0.0376 0.0214
# 8 2 0.678 -1.48
# 9 1 0.724 0.163
#10 2 1.03 0.436
另一种选择是names_sep
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = everything(), names_to = c(".value", "run"),
names_sep = "(?<=[A-Z])(?=\d)")
# A tibble: 10 x 3
# run X Y
# <chr> <dbl> <dbl>
# 1 1 0.654 1.58
# 2 2 -0.115 -0.858
# 3 1 -0.162 0.581
# 4 2 0.667 0.242
# 5 1 0.905 -0.385
# 6 2 -0.787 1.01
# 7 1 -1.68 0.171
# 8 2 0.264 0.420
# 9 1 -0.131 -0.405
#10 2 -1.15 -0.417
数据
df <- data.frame(X1 = rnorm(5), X2 = rnorm(5), Y1 = rnorm(5), Y2 = rnorm(5))
我有一个相当混乱的数据框,列名类似于
colnames(df) <- c("X1", "X2", "X3", "Y1", "Y2", "Y3")
我想更长时间地创建一个包含三列的数据框,使用 pivot_longer
,其中 X 和 Y 各有一列,第三列(称为“运行”)包含 1 ,2 或 3 取决于上面的列名。
Pivot_longer
似乎是要使用的函数,但我不确定如何使用它来动态创建 2 个名为 X 和 Y 的列,取自列名,并从列名中提取第三列的值还。
有人知道怎么做吗?值得注意的是,实际的 df 有许多不同的列名,因此不可能强制命名新列。
感谢您的帮助!
您可以使用 pivot_longer
在 names_pattern
中指定正则表达式。
df <- data.frame(X1 = rnorm(5), X2 = rnorm(5), Y1 = rnorm(5), Y2 = rnorm(5))
tidyr::pivot_longer(df,
everything(),
names_to = c('.value', 'run'),
names_pattern = '([A-Z])(\d+)')
# run X Y
# <chr> <dbl> <dbl>
# 1 1 0.376 -1.73
# 2 2 -0.497 1.24
# 3 1 0.310 -2.20
# 4 2 0.0114 0.783
# 5 1 0.00501 0.543
# 6 2 0.00986 0.0481
# 7 1 -0.0376 0.0214
# 8 2 0.678 -1.48
# 9 1 0.724 0.163
#10 2 1.03 0.436
另一种选择是names_sep
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = everything(), names_to = c(".value", "run"),
names_sep = "(?<=[A-Z])(?=\d)")
# A tibble: 10 x 3
# run X Y
# <chr> <dbl> <dbl>
# 1 1 0.654 1.58
# 2 2 -0.115 -0.858
# 3 1 -0.162 0.581
# 4 2 0.667 0.242
# 5 1 0.905 -0.385
# 6 2 -0.787 1.01
# 7 1 -1.68 0.171
# 8 2 0.264 0.420
# 9 1 -0.131 -0.405
#10 2 -1.15 -0.417
数据
df <- data.frame(X1 = rnorm(5), X2 = rnorm(5), Y1 = rnorm(5), Y2 = rnorm(5))