要重命名特定的变量,我可以例如
names(df1)[which(names(df1) == "C")] <- "X"
> df1
A B X
1 1 2 3
我想知道setNames()
是否也可以实现,但是没有重复我不想重命名的名称
df1 <- setNames(df1, c("A", "B", "X"))`
我已经尝试过setNames(df1, c(rep(NA, 2), "X"))
和setNames(df1[3], "X")
,但这是行不通的。我在setNames()
中看到的优点是,我可以在一步完成其他操作的同时设置名称。
数据
df1 <- setNames(data.frame(matrix(1:3, 1)), LETTERS[1:3])
> df1
A B C
1 1 2 3
答案 0 :(得分:6)
您可以使用replace
,
setNames(df1, replace(names(df1), names(df1) == 'B', 'X'))
# A X C
#1 1 2 3
setNames(df1, replace(names(df1), names(df1) == 'A', 'X'))
# X B C
#1 1 2 3
setNames(df1, replace(names(df1), names(df1) == 'C', 'X'))
# A B X
#1 1 2 3
答案 1 :(得分:6)
您可以使用来自库(data.table)的setnames来做到这一点
library(data.table)
setnames(DF, "oldName", "newName")
答案 2 :(得分:6)
dplyr
对此也具有特殊功能:
dplyr::rename(df1, X = C)
# A B X
# 1 1 2 3
答案 3 :(得分:4)
我所能做的最好的就是这个,这似乎并不比使用其他方法容易。您也可以编写适合您需求的函数。
df2 <- setNames(df1, c(colnames(df1)[1:2],"test"))
> df2
A B test
1 1 2 3
编辑:要更改其他名称(例如B列),我们可以定义一个自定义函数:
dfrename <- function(mydf, mycolumns=1:ncol(mydf), mynewnames=c(letters[1:mycolumns])) {
if(!is.numeric(mycolumns)) {
toreplace <- colnames(mydf) %in% mycolumns
} else {
toreplace <- 1:ncol(mydf) %in% mycolumns
}
mycols <- colnames(mydf)
mycols[toreplace] <- mynewnames
res <- setNames(mydf, mycols)
return(res)
}
您可以使用列的索引进行替换或使用其名称。
> dfrename(df1, 2, "test")
A test C
1 1 2 3
答案 4 :(得分:4)
因为数据名称是向量,所以我尝试使用ifelse()
来逻辑地标识元素。
setNames(df1, ifelse(names(df1) == "A", "X", names(df1)))
X B C
1 1 2 3
setNames(df1, ifelse(names(df1) == "B", "X", names(df1)))
A X C
1 1 2 3
setNames(df1, ifelse(names(df1) == "C", "X", names(df1)))
A B X
1 1 2 3
答案 5 :(得分:2)
如果可以重复使用旧变量的名称,则可以使用另一种基本R解决方案:
res <- transform(iris, a = Species, Species = NULL)
# [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "a"
关于效率,我不确定是否复制数据。