使用dplyr合并跨语言数据集时出现重复行问题求助
解决dplyr合并数据集时的重复行问题
问题根源分析
你遇到的重复行问题,核心原因是仅用speaker作为连接键时,这个键在两个数据集中都不是唯一标识。比如df.fr里speaker=1有3行,df.en里speaker=1也有3行,当执行left_join(df.en)时,每个speaker=1的法语行都会和所有speaker=1的英语行交叉匹配,最终产生3×3=9行重复数据,这显然不是你想要的一一对应关系。
正确的合并步骤
因为你的数据中,同一个说话人下的法、英单词是按顺序一一对应的(比如un对应one,deux对应two),我们需要添加一个分组内的行号作为额外连接键,确保每行单词能精准匹配。
步骤1:给数据集添加分组行号
先给df.fr和df.en分别添加同一说话人内的行序号,用来标记单词的对应位置:
library(dplyr) # 处理法语数据集,添加分组行号 df.fr <- df.fr %>% group_by(speaker) %>% mutate(row_id = row_number()) %>% ungroup() # 处理英语数据集,添加分组行号 df.en <- df.en %>% group_by(speaker) %>% mutate(row_id = row_number()) %>% ungroup()
步骤2:合并法、英数据集
现在用speaker+row_id作为连接键,就能保证每行单词正确匹配:
# 合并法、英数据集 combined_lang <- df.fr %>% left_join(df.en, by = c("speaker", "row_id"))
步骤3:合并类型数据集
最后和df.type按English合并(你提到每个单词在词典中仅出现一次,所以这一步不会产生重复):
# 合并类型信息并清理临时列 new.df <- combined_lang %>% left_join(df.type, by = "English") %>% select(-row_id)
最终结果
执行上述代码后,你会得到期望的结果:
print(new.df) # speaker French English type # 1 1 un one number # 2 1 deux two number # 3 1 trois three number # 4 4 chien dog animal
内容的提问来源于stack exchange,提问作者Catherine Laing
相关产品推荐
相关产品推荐

