Соедините два фрейма данных и добавьте NA для пропущенных значений объединяющего столбца. - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь объединить два фрейма данных, используя dplyr left_join. Код приведен ниже:

file = c('f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15')
word_count = c(14806, 804, 168, 27172, 782, 699, 1891, 64385, 738, 9497, 74, 181183, 173, 37, 2321)
wc_df <- cbind.data.frame(file, word_count)
variant = c('bcause', 'bcos', 'bcos', 'bcos', 'bcos', 'bcos', 'bcos', 'bcos', 'bcos', 'bcos', 'bcus', 'bcus', 'bcus', 'because', 'because', 'because', 'because', 'because', 'because', 'because', 'because', 'because', 'because', 'becos', 'becos', 'becos', 'becos', 'becos', 'becos', 'becos', 'becos', 'becos', 'bicos', 'cos', 'cos', 'cos', 'cos', 'cos', 'cos', 'cos', 'cos', 'cos', 'cus', 'cus', 'cus', 'cus', 'cus', 'cuz', 'cuz', 'cuz', 'cuz', 'cuz', 'cuz', 'cz')
file = c('f1',  'f1',  'f2',  'f3',  'f4',  'f5',  'f6',  'f7',  'f8',  'f9',  'f10',  'f11',  'f12',  'f1',  'f2',  'f3',  'f4',  'f5',  'f6',  'f7',  'f8',  'f9',  'f10',  'f1',  'f2',  'f3',  'f4',  'f5',  'f6',  'f7',  'f8',  'f9',  'f10',  'f1',  'f2',  'f3',  'f4',  'f5',  'f6',  'f7',  'f8',  'f9',  'f1',  'f2',  'f3',  'f4',  'f5',  'f6',  'f7',  'f8',  'f9',  'f10',  'f11',  'f12')
freq = c(2,  14,  3,  1,  3,  11,  14,  5,  19,  4,  2,  1,  1,  23,  2,  51,  1,  1,  4,  52,  2,  29,  4,  7,  3,  1,  112,  12,  7,  7,  2,  8,  646,  15,  1,  1,  7,  9,  1,  13,  14,  11,  1,  6,  1,  4,  2,  4,  5,  2,  3,  1,  3,  1)
freq_df <- cbind.data.frame(file, variant, freq)
new_df <- left_join(freq_df, wc_df)

Как видно, столбец file используется для объединения двух фреймов данных. Проблема в том, что freq_df всегда будет иметь несколько значений (или уровней), отсутствующих для file. Таким образом, можно заметить, что wc_df имеет 15 уровней file, но freq_df имеет только 12 из них. Когда я присоединяюсь к этим двум, используя вышеупомянутую функцию dplyr, значения / уровни file, которые недоступны в первом кадре данных, теряются. После поиска я наткнулся на функцию complete() из tidyr. Я могу применить его следующим образом, чтобы получить отсутствующие комбинации существующих file и variant (12 * 10 = 120 строк) следующим образом:

 new_df <- left_join(freq_df, wc_df) %>% tidyr::complete(file, variant, fill = list(freq = 0))

Однако я хочу получить отсутствующие значения /уровни file (от wc_df также) в new_df, где комбинации variant и file будут иметь NA (или 0) в третьем столбце freq (и общее числорядов будет 15 * 10 = 150). Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Я не уверен, что полностью понимаю вопрос, но, похоже, вам нужно dplyr::full_join() вместо dplyr::left_join, чтобы сохранить несоответствующие значения file из любого из двух соединенных фреймов данных.

0 голосов
/ 10 ноября 2019

Благодаря приведенному выше ответу с full_join я нашел решение, чтобы решить мою проблему. В full_join будут введены NA в столбцах freq и variant. Я заменяю NA в каждом столбце шаг за шагом следующим образом:

new_df <- full_join(freq_df, wc_df) %>% %>% as.data.frame() #Full join and convert to data frame
#replace NAs with previous values
new_df <- tidyr::fill(new_df, variant) #Not converting to a data frame above causes an error that the column cannot be modified because it is a grouping variable
#NAs in freq column are simply replaced by zeroes
new_df$freq <- replace(new_df$freq, is.na(new_df$freq), 0)

Теперь все значения объединяющего столбца file присутствуют в new_df. Введенные NA были исправлены вручную.

...