按名称重命名多个列
有人应该问这个,但我找不到答案。 说我有:
x = data.frame(q=1,w=2,e=3, ...and many many columns...)
什么是最优雅的方式来重新命名一个任意的列的子集,其位置,我不一定知道,到一些其他的任意名称?
例如说我想将"q"
和"e"
重命名为"A"
和"B"
,那么最优雅的代码是什么?
显然,我可以做一个循环:
oldnames = c("q","e") newnames = c("A","B") for(i in 1:2) names(x)[names(x) == oldnames[i]] = newnames[i]
但是我想知道有没有更好的办法? 也许使用一些软件包? ( plyr::rename
等)
setnames
包中的data.table
可以在data.frame
或data.table
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!)
另一个不太大的数据框架的解决scheme是(基于@thelatemail的答案):
x <- data.frame(q=1,w=2,e=3) > x qwe 1 1 2 3 colnames(x) <- c("A","w","B") > x A w B 1 1 2 3
或者,您也可以使用:
names(x) <- c("C","w","D") > x C w D 1 1 2 3
此外,您还可以重命名列名的子集:
names(x)[2:3] <- c("E","F") > x CEF 1 1 2 3
用dplyr你可以这样做:
df = data.frame(q = 1, w = 2, e = 3) df = df %>% rename(A = q, B = e) df # A w B #1 1 2 3
所以我最近自己碰到这个,如果你不确定是否存在这些列,只想重命名那些:
existing <- match(oldNames,names(x)) names(x)[na.omit(existing)] <- newNames[which(!is.na(existing))]
这将改变所有名字的所有事件:
names(x) <- gsub("q", "A", gsub("e", "B", names(x) ) )
build立在@ user3114046的答案:
x <- data.frame(q=1,w=2,e=3) x # qwe #1 1 2 3 names(x)[match(oldnames,names(x))] <- newnames x # A w B #1 1 2 3
这不会依赖于x
数据集中列的特定顺序。
names(x)[names(x) %in% c("q","e")]<-c("A","B")
您可以获取名称设置,将其保存为列表,然后对string进行批量重命名。 一个很好的例子就是当你在一个数据集上进行一个很长很长的过渡时:
names(labWide) Lab1 Lab10 Lab11 Lab12 Lab13 Lab14 Lab15 Lab16 1 35.75366 22.79493 30.32075 34.25637 30.66477 32.04059 24.46663 22.53063 nameVec <- names(labWide) nameVec <- gsub("Lab","LabLat",nameVec) names(labWide) <- nameVec "LabLat1" "LabLat10" "LabLat11" "LabLat12" "LabLat13" "LabLat14""LabLat15" "LabLat16" "
如果一行数据中包含要更改所有列的名称,则可以执行此操作
names(data) <- data[row,]
给定的data
是您的数据框, row
是包含新值的行号。
然后你可以删除包含名字的行
data <- data[-row,]