为某些变量添加前缀而不触及其他变量?

Posted

技术标签:

【中文标题】为某些变量添加前缀而不触及其他变量?【英文标题】:Adding prefixes to some variables without touching others? 【发布时间】:2017-09-25 12:54:41 【问题描述】:

我想从 df1 生成一个像 df3 这样的数据框,即为没有前缀的变量添加前缀 (important_),同时不接触具有某些前缀的变量(gea_、win_、hea_)。到目前为止,我只管理了类似 df2 的东西,其中 important_ 变量最终在一个单独的数据框中,但我希望所有变量都在同一个数据框中。对此的任何想法将不胜感激。

我有什么:

library(dplyr)

df1 <- data.frame("hea_income"=c(45000,23465,89522),"gea_property"=c(1,1,2) ,"win_state"=c("AB","CA","GA"), "education"=c(1,2,3), "commute"=c(13,32,1))

df2 <- df1 %>% select(-contains("gea_")) %>% select(-contains("win_")) %>% select(-contains("hea_"))  %>% setNames(paste0('important_', names(.)))

我想要什么:

df3 <- data.frame("hea_income"=c(45000,23465,89522),"gea_property"=c(1,1,2) ,"win_state"=c("AB","CA","GA"), "important_education"=c(1,2,3), "important_commute"=c(13,32,1))

【问题讨论】:

【参考方案1】:

一个选项是rename_at

dfN <- df1 %>%
         rename_at(4:5, funs(paste0("important_", .)))
identical(dfN, df3)
#[1] TRUE

如果我们想指定变量而不是数字索引,我们也可以包含一些正则表达式。这里的假设是所有那些还没有 _

的列
df1 %>%
    rename_at(vars(matches("^[^_]*$")), funs(paste0("important_", .)))
#   hea_income gea_property win_state important_education important_commute
#1      45000            1        AB                   1                13
#2      23465            1        CA                   2                32
#3      89522            2        GA                   3                 1

或者matches-

df1 %>%
    rename_at(vars(-matches("_")), funs(paste0("important_", .)))
#   hea_income gea_property win_state important_education important_commute
#1      45000            1        AB                   1                13
#2      23465            1        CA                   2                32
#3      89522            2        GA                   3                 1

上述所有三个解决方案都得到了预期的输出,如 OP 的帖子所示

【讨论】:

【参考方案2】:

这是另一种可能性:

names(df1) <- names(df1) %>% ifelse(grepl("_",.),.,paste0("important_",.))
# > df1
#   hea_income gea_property win_state important_education important_commute
# 1      45000            1        AB                   1                13
# 2      23465            1        CA                   2                32
# 3      89522            2        GA                   3                 1

【讨论】:

对,我一直很草率,我可以用names(df1) %&gt;% inset(!grepl("_",.),paste0("important_",.)[which(!grepl("_",.))]) 修复它,但它不再那么漂亮了,所以我从答案中删除了它 (即使没有不需要的which 相关:***.com/questions/46409397/…

以上是关于为某些变量添加前缀而不触及其他变量?的主要内容,如果未能解决你的问题,请参考以下文章

在某些 Bash 自动完成选项的末尾添加空格,而不是在其他选项的末尾?

对列名排序后转置和添加前缀的宏

在 Laravel 中添加前缀路由名称而不添加前缀 URI

Azure 网络安全组使用变量添加源 ip 前缀

使用 awk sub 以数字方式为字符串添加前缀而不更改计数状态最多 5 个匹配“在每行具有多个匹配项的文本文件中”

ReSharper 为 lambda 表达式中的变量名提供“@”前缀