微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于 R 中的名称索引重命名 data.frame/tible 中连续列的子集

如何解决基于 R 中的名称索引重命名 data.frame/tible 中连续列的子集

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

示例数据:

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')

我想使用某种 : 运算符来选择,例如,名称栏为 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 的替代品。

有什么想法吗?

解决方法

我们可以使用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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。