在dplyr()中聚合数据时重复的行

时间:2018-06-01 13:57:47

标签: r dplyr

我正在尝试通过在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.endf.fr加入speaker,然后通过{{df.type加入English 1}}。

最好我会用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'到'two'等等:

   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 :(得分:1)

cbind三个数据集外,您可以为idspeaker的每个df.fr创建一个唯一的df.en,并加入{{} 1}} + 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) 中的mapreduce来编写更通用的解决方案:

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)