【问题标题】:renaming a subset of contiguous columns in a data.frame/tible based on name-indexing in R根据 R 中的名称索引重命名 data.frame/tible 中连续列的子集
【发布时间】:2021-04-28 01:04:59
【问题描述】:

我想按列名选择连续列的子集,然后用字符向量重命名。

示例数据:

data<-data.frame(foo=1:4, bar=10:13, zoo_1=letters[1:4], zoo_2=letters[5:8])

  foo bar zoo_1 zoo_2
1   1  10     a     e
2   2  11     b     f
3   3  12     c     g
4   4  13     d     h

要替换的列名:'bar'、'zoo_1'、'zoo_2'

新名称:

new_names<-c('a', 'b', 'c')

我想使用某种 : 运算符来选择,例如,名称 bar 到 zoo_2 的列

我发现了一些奇怪的解决方案:

#1
names(data)[which(names(df)=='bar'):which(names(df)=='zoo_2')]<-new_names

#2
my_rename<-function(x,y,z){
        names(x)[match(y, names(df))]<-z
        names(x)
}
names(data)<-my_rename(data, c('bar', 'zoo_1', 'zoo_2'), c(new_names)

解决方案 #2 不好,因为它需要拼出所有要替换的名称。

解决方案 #1 允许我以 'bar':'zoo_2' 样式选择名称,但它非常冗长,可能会让其他人感到困惑。我最感兴趣的是这个 (which:which) hack 的替代品。

有什么想法吗?

【问题讨论】:

    标签: r dplyr rename names


    【解决方案1】:

    我们可以使用rename_at

    library(dplyr)
    data <- data %>%
               rename_at(vars(bar:zoo_2), ~ new_names)
    names(data)
    #[1] "foo" "a"   "b"   "c"
    

    但是,在 dplyr 1.05 中,rename_at 已被 rename_with 取代:

    data2<-data %>%
            rename_with(.cols=bar:zoo_2, ~ new_names)
    
    > identical(data, data2)
    [1] TRUE
    

    【讨论】:

    • 太棒了。所以 vars() 函数允许我使用 select() - 类似语法?这个 ~ 运算符在这里的作用是什么?为什么不简单地调用 new_names 作为参数(而不是 '~new_names')?我仍然无法在函数调用中使用这些 '.~' 、 '~' 、 '.fun' 符号(公式除外)
    • @GuedesBF 对于rename_at_with,您可能需要包装vars 或指定.vars =~ 是一个 lamdba 函数 function(x)(tidyverse 中的缩写)
    • @GuedesBF 它需要函数.funs 的原因。因此可以在这里使用匿名/lambda
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2023-01-14
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多