R 使用 rename_with() 重命名带有通配符的多列
R rename multiple columns with wildcard with rename_with()
图书馆(tidyverse)
我想重命名一堆列,我尝试在 R 中使用 rename_at() 或 rename_with() 但收效甚微,有人可以帮忙吗?非常感谢您的帮助。
原始数据框列名
tibble(
AAA_BBB1_P1_Elev = as.double(),
AAA_BBB2_P2_Elev = as.double(),
AAA_BBB2_P3_Elev = as.double()
)
想要将列名更改为
tibble(
`BBB1-P1E` = as.double(),
`BBB1-P2E` = as.double(),
`BBB1-P3E` = as.double()
)
我们可以使用 rename_all
和 str_replace
library(dplyr)
library(stringr)
tbl2 <- tbl1 %>%
rename_all(~ str_replace_all(str_replace(., '^[^_]+_(.*)_(.)[^.]+$', "\1\2"), '_', "-"))
-输出
tbl2
# A tibble: 0 x 3
# … with 3 variables: `BBB1-P1E` <dbl>, `BBB2-P2E` <dbl>, `BBB2-P3E` <dbl>
数据
tbl1 <- structure(list(AAA_BBB1_P1_Elev = numeric(0), AAA_BBB2_P2_Elev = numeric(0),
AAA_BBB2_P3_Elev = numeric(0)), row.names = integer(0), class = c("tbl_df",
"tbl", "data.frame"))
受 akrun 回答的启发,我想出了一个解决方法...
remove <- c("AAA_BBB[0-9]_", "lev", "_")
tibble(
AAA_BBB1_P1_Elev = as.double(),
AAA_BBB2_P2_Elev = as.double(),
AAA_BBB2_P3_Elev = as.double()
) %>%
rename_all(~ str_remove_all(., paste(remove, collapse = "|"))) %>%
rename_at(vars(ends_with("E")), ~ paste0("BBB1-", .x))
# A tibble: 0 x 3
# ... with 3 variables: BBB1-P1E <dbl>, BBB1-P2E <dbl>, BBB1-P3E <dbl>
基础 R 选项:
names(df) <- sub('\w+_(\w+)_(\w+)_.*', '\1-\2E', names(df))
names(df)
#"BBB1-P1E" "BBB2-P2E" "BBB2-P3E"
我遇到了类似的问题。两次接受测试的人的数据为
Data %>%
select(Identifier, contains('eq5d'),-EQ5D3L_Combined) %>%
names()
给出了这份名单。
"Identifier" "EQ5D3L_Item_1" "EQ5D3L_Item_2"
"EQ5D3L_Item_3" "EQ5D3L_Item_4" "EQ5D3L_Item_5"
"EQ5D3L_VAS" "EQ5D3L_Item_1_2" "EQ5D3L_Item_2_2"
"EQ5D3L_Item_3_2" "EQ5D3L_Item_4_2" "EQ5D3L_Item_5_2"
"EQ5D3L_VAS_2"
'_2'是第二次测量时机,我需要将'_1'放在第一次测量变量的末尾。
为了解决这个问题,我使用了 rename_with,如下所示
Data %>%
select(Identifier, contains('eq5d'),-EQ5D3L_Combined) %>%
rename_with(~ifelse(!str_ends(.x,'[0-9]'),
str_c(.x,'_1'),
.x)) %>%
names()
!str_end 挑选出 不是 以数字结尾的变量名称,作为逻辑向量。 ifelse 仅将 rename_with 应用于那些没有以数字结尾的那些,而 str_c 将 '_1' 添加到那些 - 所以我现在为简单的 pivot_longer 正确命名了我的变量.
图书馆(tidyverse)
我想重命名一堆列,我尝试在 R 中使用 rename_at() 或 rename_with() 但收效甚微,有人可以帮忙吗?非常感谢您的帮助。
原始数据框列名
tibble(
AAA_BBB1_P1_Elev = as.double(),
AAA_BBB2_P2_Elev = as.double(),
AAA_BBB2_P3_Elev = as.double()
)
想要将列名更改为
tibble(
`BBB1-P1E` = as.double(),
`BBB1-P2E` = as.double(),
`BBB1-P3E` = as.double()
)
我们可以使用 rename_all
和 str_replace
library(dplyr)
library(stringr)
tbl2 <- tbl1 %>%
rename_all(~ str_replace_all(str_replace(., '^[^_]+_(.*)_(.)[^.]+$', "\1\2"), '_', "-"))
-输出
tbl2
# A tibble: 0 x 3
# … with 3 variables: `BBB1-P1E` <dbl>, `BBB2-P2E` <dbl>, `BBB2-P3E` <dbl>
数据
tbl1 <- structure(list(AAA_BBB1_P1_Elev = numeric(0), AAA_BBB2_P2_Elev = numeric(0),
AAA_BBB2_P3_Elev = numeric(0)), row.names = integer(0), class = c("tbl_df",
"tbl", "data.frame"))
受 akrun 回答的启发,我想出了一个解决方法...
remove <- c("AAA_BBB[0-9]_", "lev", "_")
tibble(
AAA_BBB1_P1_Elev = as.double(),
AAA_BBB2_P2_Elev = as.double(),
AAA_BBB2_P3_Elev = as.double()
) %>%
rename_all(~ str_remove_all(., paste(remove, collapse = "|"))) %>%
rename_at(vars(ends_with("E")), ~ paste0("BBB1-", .x))
# A tibble: 0 x 3
# ... with 3 variables: BBB1-P1E <dbl>, BBB1-P2E <dbl>, BBB1-P3E <dbl>
基础 R 选项:
names(df) <- sub('\w+_(\w+)_(\w+)_.*', '\1-\2E', names(df))
names(df)
#"BBB1-P1E" "BBB2-P2E" "BBB2-P3E"
我遇到了类似的问题。两次接受测试的人的数据为
Data %>%
select(Identifier, contains('eq5d'),-EQ5D3L_Combined) %>%
names()
给出了这份名单。
"Identifier" "EQ5D3L_Item_1" "EQ5D3L_Item_2"
"EQ5D3L_Item_3" "EQ5D3L_Item_4" "EQ5D3L_Item_5"
"EQ5D3L_VAS" "EQ5D3L_Item_1_2" "EQ5D3L_Item_2_2" "EQ5D3L_Item_3_2" "EQ5D3L_Item_4_2" "EQ5D3L_Item_5_2" "EQ5D3L_VAS_2"
'_2'是第二次测量时机,我需要将'_1'放在第一次测量变量的末尾。
为了解决这个问题,我使用了 rename_with,如下所示
Data %>%
select(Identifier, contains('eq5d'),-EQ5D3L_Combined) %>%
rename_with(~ifelse(!str_ends(.x,'[0-9]'),
str_c(.x,'_1'),
.x)) %>%
names()
!str_end 挑选出 不是 以数字结尾的变量名称,作为逻辑向量。 ifelse 仅将 rename_with 应用于那些没有以数字结尾的那些,而 str_c 将 '_1' 添加到那些 - 所以我现在为简单的 pivot_longer 正确命名了我的变量.