使用rename_with()通配符重命名多个列

3

使用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()
)

4个回答

1
我们可以使用 rename_allstr_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"))

1
不完全是...但受到你的答案启发,我找到了一个解决方法。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` , `BBB1-P2E` , `BBB1-P3E` - Nick
@Nick 我发表的解决方案是基于模式的出现,即我们删除第一个单词后面跟着的 _ 和以 Elev 结尾的 _ - akrun
@Nick 我认为更新现在应该可以工作了。我忽略了结尾的E。 - akrun
感谢@akrun,为了与其他列保持一致(未显示),我需要格式为'BBB1-P1E','BBB1-P2E'等,这就是为什么原始解决方案不起作用的原因。 - Nick
1
没关系 @akrun :-) 非常感谢您在此事上的帮助。 - Nick
显示剩余3条评论

1
受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> 

0

基本 R 选项:

names(df) <- sub('\\w+_(\\w+)_(\\w+)_.*', '\\1-\\2E', names(df))
names(df)
#"BBB1-P1E" "BBB2-P2E" "BBB2-P3E"

0

我有一个类似的问题。两次测试的人员数据如下:

Data %>%
  select(Identifier, contains('eq5d'),-EQ5D3L_Combined) %>%
  names()

它提供了这个名字列表。

"标识符" "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 操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接