R 如果列表中存在列名,则为列名添加前缀

问题描述 投票:0回答:1

我找到了部分帮助的答案,但我无法让完整的代码正常工作。

如果列名在向量列表中,则添加前缀

资料:

    data <-
    structure(list(ID = c(111L, 222L, 333L), 
    desc = c("uc1", "uc2", "uc3"),
    var1 = c("A", "A", "B"), 
    var2 = c("B", "B", "C"), 
    var3 = c("C", "C", "D"), 
    GENDER = c("F", "M", "M"), 
    AGE = c(25L, 25L, 24L)), 
    class = "data.frame", row.names = c(NA, -3L))

    #list of demographic variables I need to add a prefix to for modelling   
    demog = c("GENDER", "AGE")

我想做什么:

如果列名存在于我的人口统计变量列表中,则向列名添加前缀“d”。

我已经按照下面的思路尝试了各种版本,但都没有用。

     #following creates errors    
         colnames(data)[demog[(demog %in% colnames(data))]] <-
          paste('d', colnames(data)[demog[(demog %in% colnames(data))]], sep = '_')

     data <- 
     ifelse(names(data) %in% demog, paste0(demog, 'd', sep = '_'), colnames(data))

对于不同的变量分组,我有许多不同的列表,因此无法手动完成。我想要一个所有其他列名都相同但我有“d_GENDER”和“d_AGE”的输出。

非常感谢任何帮助。

r list dplyr paste
1个回答
1
投票

我们可以使用

rename_with
。此函数接受
tidy-select
语句来选择要转换的列。
any_off
是这里要使用的那个,因为它接受字符向量,并且只转换匹配的列并忽略其余的列。

library(dplyr)
data |>
    rename_with(.cols = any_of(demog),
                .fn = ~paste0('d_',.x))

   ID desc var1 var2 var3 d_GENDER d_AGE
1 111  uc1    A    B    C        F    25
2 222  uc2    A    B    C        M    25
3 333  uc3    B    C    D        M    24
© www.soinside.com 2019 - 2024. All rights reserved.