Переименование переменных на основе значений в другом кадре данных - PullRequest
0 голосов
/ 17 марта 2019

У меня есть два кадра данных, DF1 и DF2:

DF1 <- data.frame(V1 = factor(c("A", "B", "C", "D")),
                 V2 = factor(c("E", "F", "G", "H")),
                 Va3 = factor(c("I", "J", "K", "L")),
                 column = factor(c("M", "N", "O", "P")))

DF2 <- data.frame(N1 = factor(c("x", "V1", "V2", "y", "z", "Va3", "a", "column")),
                  N2 = factor(c("A", "var1", "random", "R", "Q", "nameofcolumn", "S", "varname4")))

Я хочу изменить имя переменных в DF1 (V1:column), основываясь на значении соответствующей ячейки в DF2$N2, например, V2 становится random, а column становится varname4.

Обычно я просто использовал бы colnames(DF1) <- DF2$N2, если имена переменных в DF1 соответствовали значениям ячеек в DF2;но здесь у меня есть эти дополнительные значения.Как правильно переименовать переменные?

Ответы [ 3 ]

2 голосов
/ 18 марта 2019

В версии 1.12.0 (в CRAN 13 января 2019 г.) функция setnames() получила новый параметр skip_absent для пропуска имен в old, которые не являются подарок. setnames() также работает с data.frame и data.table.

data.table::setnames(DF1, as.character(DF2$N1), as.character(DF2$N2), skip_absent = TRUE)
DF1
  var1 random nameofcolumn varname4
1    A      E            I        M
2    B      F            J        N
3    C      G            K        O
4    D      H            L        P

Или с дополнительным столбцом, не включенным в DF2:

DF1 <- data.frame(V1 = factor(c("A", "B", "C", "D")),
                  V2 = factor(c("E", "F", "G", "H")),
                  Va3 = factor(c("I", "J", "K", "L")),
                  column = factor(c("M", "N", "O", "P")),
                  other = 1:4)
data.table::setnames(DF1, as.character(DF2$N1), as.character(DF2$N2), skip_absent = TRUE)
DF1
  var1 random nameofcolumn varname4 other
1    A      E            I        M     1
2    B      F            J        N     2
3    C      G            K        O     3
4    D      H            L        P     4
1 голос
/ 17 марта 2019

Мы можем просто использовать match

names(DF1)=DF2$N2[match(names(DF1),DF2$N1)]
DF1
  var1 random nameofcolumn varname4
1    A      E            I        M
2    B      F            J        N
3    C      G            K        O
4    D      H            L        P

Обновление

names(DF1)[which(names(DF1)%in%DF2$N1)]=as.character(DF2$N2[match(names(DF1)[which(names(DF1)%in%DF2$N1)],DF2$N1)])
DF1
  var1 random nameofcolumn varname4 somethingelse
1    A      E            I        M             M
2    B      F            J        N             N
3    C      G            K        O             O
4    D      H            L        P             P
1 голос
/ 17 марта 2019

Вам необходимо использовать . В зависимости от ваших реальных потребностей шаблон, на основе которого вам нужно извлечь значения, может измениться. Прямо сейчас я извлекаю «ячейки», которые начинаются с (^ переводит на это) varname и * означает, что будет дальше. Предполагая, что порядок имен переменных также правильный.

Примечание: на основе первой версии вопроса, в которой имена столбцов были varname#.

colnames(DF1) <-  subset(DF2$N2, grepl("^varname*", DF2$N2))

str(DF1)
# 'data.frame': 4 obs. of  4 variables:
# $ varnames1: Factor w/ 4 levels "A","B","C","D": 1 2 3 4
# $ varname2 : Factor w/ 4 levels "E","F","G","H": 1 2 3 4
# $ varname3 : Factor w/ 4 levels "I","J","K","L": 1 2 3 4
# $ varname4 : Factor w/ 4 levels "M","N","O","P": 1 2 3 4        

Я осознаю избыточность в моем шаблоне. Просто включите * и ^, чтобы дать ОП немного больше понимания.

Обновление для ответа на отредактированный вопрос: Соответствующие значения в N1 для поиска имен столбцов в N2:

Вы можете подмножество на основе значений в N1 и colnames(DF1):

subset(DF2, (N1 %in% colnames(DF1)))
#       N1           N2
# 2     V1         var1
# 3     V2       random
# 6    Va3 nameofcolumn
# 8 column     varname4

Вы можете присвоить им имена столбцов DF1, как показано ниже (вы можете также попробовать оператор $):

colnames(DF1) <- DF2$N2[as.numeric(rownames(subset(DF2, (N1 %in% colnames(DF1)))))]

Если сортировка была разной в двух фреймах данных, посмотрите на этот поток: Сортировка одного вектора на основе другого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...