我正在尝试通过在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
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
答案 0 :(得分:1)
除cbind
三个数据集外,您可以为id
和speaker
的每个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)
中的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)