Дублированные строки при агрегировании данных в dplyr () - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь создать набор кросс-лингвистических данных, объединяя три набора данных в dplyr ().Два набора данных являются своего рода «словарями» - это списки слов, которые я хочу прикрепить к докладчикам.В данных имеется 15 говорящих и, следовательно, несколько повторений, в то время как каждое слово появляется в каждом из словарей только один раз.

Когда я соединяю два с помощью left_join (), я получаю реплицированные ячейки.Я знаю, что могу удалить дублирующиеся ячейки, но я чувствую, что должно быть что-то простое, что я делаю неправильно, чтобы создать эту проблему.

Пример данных выглядит следующим образом:

 French <- c("un", "deux", "trois", "chien")
 English <- c("one", "two", "three", "dog")
 type <- c("number", "number", "number", "animal")
 speaker <- c(1, 1, 1, 4)

 df.fr = data.frame(speaker, French)
 df.en = data.frame(speaker, English)
 df.type = data.frame(English, type)

Я хочу создать новый набор данных new.df, соединив df.en и df.fr с speaker, а затем соединив его с df.type с English.

Предпочтительно, я бы использовал dplyr() сделать это.Когда я делаю следующее, я получаю дублированные строки:

 new.data <- df.fr %>% left_join(df.en)

, который генерирует

    speaker French English
 1        1     un     one
 2        1     un     two
 3        1     un   three
 4        1   deux     one
 5        1   deux     two
 6        1   deux   three
 7        1  trois     one
 8        1  trois     two
 9        1  trois   three
 10       4  chien     dog

Когда на самом деле я просто хочу, чтобы он соединял 'un' с 'one', 'deux'на «два» и т. д .:

   speaker French English   type
 1       1     un     one number
 2       1   deux     two number
 3       1  trois   three number
 4       4  chien     dog animal

1 Ответ

0 голосов
/ 01 июня 2018

Помимо cbind из трех наборов данных, вы можете создать уникальный id для каждого speaker для df.fr и df.en и присоединиться к speaker + id:

library(dplyr)

df.fr %>%
  group_by(speaker) %>%
  mutate(id = 1:n()) %>%
  left_join(df.en %>% group_by(speaker) %>% mutate(id = 1:n()),
            by = c("speaker", "id")) %>%
  left_join(df.type) %>%
  select(-id)

Если у вас более двух языковых наборов данных, вы также можете написать более общее решение, используя map и reduce из purrr:

library(purrr)

list(df.fr, df.en) %>%
  map(~ group_by(., speaker) %>% mutate(id = 1:n())) %>%
  reduce(left_join, by = c("speaker", "id")) %>%
  left_join(df.type) %>%
  select(-id)

Результат:

# A tibble: 4 x 4
# Groups:   speaker [2]
  speaker French English   type
    <dbl> <fctr>  <fctr> <fctr>
1       1     un     one number
2       1   deux     two number
3       1  trois   three number
4       4  chien     dog animal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...