Учитывая столбец ключей, перезаписать его столбцом строк на основе словаря - PullRequest
0 голосов
/ 30 августа 2018

У меня есть два следующих кадра данных:

 n <- 15000
 key <- sample(1:10, 10)
 dictionary <- data.frame(key = key, value = LETTERS[1:10])

 target_df <- data.frame(code = sample(key, n, replace = TRUE))
 target_df$code[sample(seq_len(n), 10)] <- 0

Я хочу перезаписать code соответствующими value s из dictionary. Что такое эффективный и читабельный способ сделать это? Я использовал

find_in_dictionary <- function(x) {
  y <- dictionary[match(x, dictionary[, 1]), 2]
}

target_df$code <- find_in_dictionary(target_df$code)
sum(is.na(target_df$code))

Кажется, что он работает нормально, и он правильно обрабатывает случаи отсутствия совпадений. У вас есть лучшие предложения?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Использование sqldf: Отобразите key и value, взглянув на left join в обоих data.frame на основе key.

Перед запуском вам нужно просто изменить colnames из target_df.

colnames(target_df)<-c("key")
head(sqldf("Select t.key,d.value from target_df t LEFT JOIN dictionary d on (t.key=d.key)"))

Выход:

   key value
1   1     I
2   3     B
3   1     I
4   5     C
5   2     F
6   7     E
0 голосов
/ 30 августа 2018

Вам нужно использовать функцию dplyr left_join. Это соединение SQL.

library(dplyr)
library(tidyr)
n <- 15000
key <- sample(1:10, 10)
dictionary <- data.frame(key = key, value = LETTERS[1:10])

target_df <- data.frame(code = sample(key, n, replace = TRUE))
target_df$code[sample(seq_len(n), 10)] <- 0

target_df %>%
  arrange(code) %>%
  left_join(dictionary, by = c("code"="key")) %>%
  drop_na(.)-> final_df

head(final_df)
#>    code value
#> 11    1     I
#> 12    1     I
#> 13    1     I
#> 14    1     I
#> 15    1     I
#> 16    1     I

# final_df without 'order'
target_df %>%
  left_join(dictionary, by = c("code"="key")) %>%
  drop_na(.) %>%
  head(.)
#>   code value
#> 1    6     A
#> 2    6     A
#> 3    8     D
#> 4    7     F
#> 5    8     D
#> 6    9     H

final_df %>%
  select(value) %>%
  head(.)
#>    value
#> 11     I
#> 12     I
#> 13     I
#> 14     I
#> 15     I
#> 16     I

Вы также можете использовать пакет data.table для достижения аналогичных результатов. У SO много вопросов по этому поводу.

Создано в 2018-08-30 пакетом представлением (v0.2.0)

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