首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >按名称重命名多个列

按名称重命名多个列
EN

Stack Overflow用户
提问于 2014-01-08 12:52:08
回答 18查看 223.8K关注 0票数 95

应该有人已经问过这个问题了,但是我找不到答案。假设我有:

代码语言:javascript
复制
x = data.frame(q=1,w=2,e=3, ...and many many columns...)  

将我不一定知道其位置的任意列的子集重命名为其他任意名称的最优雅方法是什么?

例如,假设我想将"q""e"重命名为"A""B",那么最优雅的代码是什么?

显然,我可以执行一次循环:

代码语言:javascript
复制
oldnames = c("q","e")
newnames = c("A","B")
for(i in 1:2) names(x)[names(x) == oldnames[i]] = newnames[i]

但我想知道有没有更好的方法?也许可以使用一些包?(plyr::rename等)

EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2014-01-08 13:27:53

data.table包中的setnames可以在data.framedata.table上运行

代码语言:javascript
复制
library(data.table)
d <- data.frame(a=1:2,b=2:3,d=4:5)
setnames(d, old = c('a','d'), new = c('anew','dnew'))
d


 #   anew b dnew
 # 1    1 2    4
 # 2    2 3    5

请注意,更改是通过引用进行的,因此不能复制(即使是对于data.frames!)

票数 117
EN

Stack Overflow用户

发布于 2016-12-27 18:03:05

使用dplyr,您将执行以下操作:

代码语言:javascript
复制
library(dplyr)

df = data.frame(q = 1, w = 2, e = 3)
    
df %>% rename(A = q, B = e)

#  A w B
#1 1 2 3

或者,如果您想使用向量,如@Jelena-bioinf所建议的:

代码语言:javascript
复制
library(dplyr)

df = data.frame(q = 1, w = 2, e = 3)

oldnames = c("q","e")
newnames = c("A","B")

df %>% rename_at(vars(oldnames), ~ newnames)

#  A w B
#1 1 2 3

L. D. Nicolas May建议在rename_at即将被rename_with取代的情况下进行更改

代码语言:javascript
复制
df %>% 
  rename_with(~ newnames[which(oldnames == .x)], .cols = oldnames)

#  A w B
#1 1 2 3
票数 113
EN

Stack Overflow用户

发布于 2014-01-08 16:14:56

对于不太大的数据帧,另一个解决方案是(基于@thelatemail答案构建):

代码语言:javascript
复制
x <- data.frame(q=1,w=2,e=3)

> x
  q w e
1 1 2 3

colnames(x) <- c("A","w","B")

> x
  A w B
1 1 2 3

或者,您也可以使用:

代码语言:javascript
复制
names(x) <- c("C","w","D")

> x
  C w D
1 1 2 3

此外,您还可以重命名列名的子集:

代码语言:javascript
复制
names(x)[2:3] <- c("E","F")

> x
  C E F
1 1 2 3
票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20987295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档