R Заменить имена в нескольких столбцах идентификаторами из другого объекта. - PullRequest
0 голосов
/ 19 января 2019

У меня есть набор данных о пациентах df Я пытаюсь идентифицировать в R.

structure(list(name = structure(c(2L, 5L, 1L, 6L, 4L, 3L), .Label = c("Andrew", 
                                                                      "Jim", "Kurt", "Lester", "Mickey", "Taylor"), class = "factor"), 
               heart_rate = c(78L, 82L, 67L, 105L, 85L, 94L), age = c(35L, 
                                                                      23L, 43L, 52L, 33L, 45L), partner = structure(c(5L, 2L, 6L, 
                                                                                                                      1L, 3L, 4L), .Label = c("Andrew", "Jim ", "Kurt ", "Lester ", 
                                                                                                                                              "Mickey ", "Taylor "), class = "factor")), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                             -6L))

Я хочу заменить имена столбцов name и partner на основе столбца id этого объекта с именем key

structure(list(name = structure(c(2L, 5L, 1L, 6L, 4L, 3L), .Label = c("Andrew", 
"Jim", "Kurt", "Lester", "Mickey", "Taylor"), class = "factor"), 
    id = structure(c(2L, 5L, 1L, 6L, 4L, 3L), .Label = c("A3", 
    "J9", "K5", "L4", "M4", "T7"), class = "factor")), class = "data.frame", row.names = c(NA, 
-6L))

Я могу де-идентифицировать столбец name с помощью этого кода

df[["name"]] <- key[ match(df[['name']], key[['name']] ) , 'id']

но, когда я пытаюсь отождествить столбец partner с этим кодом

df[["partner"]] <- key[ match(df[['partner']], key[['name']] ) , 'id']

Мой фрейм данных выглядит так

structure(list(name = structure(c(2L, 5L, 1L, 6L, 4L, 3L), .Label = c("A3", 
"J9", "K5", "L4", "M4", "T7"), class = "factor"), heart_rate = c(78L, 
82L, 67L, 105L, 85L, 94L), age = c(35L, 23L, 43L, 52L, 33L, 45L
), partner = structure(c(NA, NA, NA, 1L, NA, NA), .Label = c("A3", 
"J9", "K5", "L4", "M4", "T7"), class = "factor")), row.names = c(NA, 
-6L), class = "data.frame")

У кого-нибудь есть предложения? Мы высоко ценим бонусные баллы за методы, которые могут быть применены ко всем столбцам в наборе данных в одной строке и объяснениям кода.

1 Ответ

0 голосов
/ 19 января 2019

Проблема в том, что в вашем partner столбце в df есть пробел после большинства слов:

.Label = c("Andrew", "Jim ", "Kurt ", "Lester ", "Mickey ", "Taylor ")

Это означает, что match() не найдет точное совпадение, кроме имени «Эндрю», для которого он правильно возвращает этот индекс.

Способ исправить это - удалить пробелы из столбца partner с помощью

df$partner = trimws(df$partner)

тогда ваш код работает нормально:

> df[["partner"]] <- key[ match(df[['partner']], key[['name']] ) , 'id']
> df
  name heart_rate age partner
1   J9         78  35      M4
2   M4         82  23      J9
3   A3         67  43      T7
4   T7        105  52      A3
5   L4         85  33      K5
6   K5         94  45      L4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...