Как переименовать конкретную переменную фрейма данных с помощью setNames ()? - PullRequest
0 голосов
/ 06 ноября 2018

Чтобы переименовать конкретную переменную, я могу сделать, например,

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 голосов
/ 06 ноября 2018

Другое базовое решение R, если вы можете повторить имя старой переменной:

res <- transform(iris, a = Species, Species = NULL)
# [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "a" 

Что касается эффективности, я не уверен, скопированы ли данные или нет.

0 голосов
/ 06 ноября 2018

dplyr также имеет специальную функцию для этого:

dplyr::rename(df1, X = C)
#   A B X
# 1 1 2 3
0 голосов
/ 06 ноября 2018

Поскольку имена данных - это вектор, я пытаюсь использовать 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
0 голосов
/ 06 ноября 2018

Вы можете сделать это, используя setnames из библиотеки (data.table)

library(data.table)

setnames(DF, "oldName", "newName")
0 голосов
/ 06 ноября 2018

Лучшее, что я могу сделать, это то, что не кажется проще, чем использование других методов. Вы также можете написать функцию, которая будет соответствовать вашим потребностям ..

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
0 голосов
/ 06 ноября 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...