如何使用setNames()重命名数据框的特定变量?

时间:2018-11-06 08:55:54

标签: r

要重命名特定的变量,我可以例如

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    

6 个答案:

答案 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" 

关于效率,我不确定是否复制数据。