通过匹配列中的值来合并R中不同长度的数据集?

时间:2019-02-22 00:11:06

标签: r merge

我有两个数据集。一个看起来像这样:

df <- data.frame(Book=c(1,1,1,2,2,2,3,3,3), 
                 Character=c('Sally', 'Jessie', 'Linda', 'Sally', 'Jessie', 'Linda', 'Sally', 'Jessie', 'Linda'),
                 Target=c('Jessie', 'Linda', 'Sally', 'Jessie', 'Linda', 'Sally', 'Jessie', 'Linda', 'Sally'),
                 Word=c('time', 'good', 'like', 'time', 'good', 'like', 'time', 'good', 'like'),
                 Total=c(1,2,4,2,4,3,2,4,4))

另一个看起来像这样:

df2 <- data.frame(Character=c('Sally', 'Jessie', 'Linda'),
                 Word=c('time', 'good', 'like'),
                 AllTotal=c(5,10,11))

我想做的是合并集合,并保持与df + 1个新列(AllTotal)相同的尺寸。例如,我想证明Sally在整个数据集中总共5次中对书1中的Jessie说了“ time”一词。最终表的布局如下所示:

df3 <- data.frame(Book=c(1,1,1,2,2,2,3,3,3), 
                 Character=c('Sally', 'Jessie', 'Linda', 'Sally', 'Jessie', 'Linda', 'Sally', 'Jessie', 'Linda'),
                 Target=c('Jessie', 'Sally', 'Jessie', 'Jessie', 'Sally', 'Sally', 'Jessie', 'Linda', 'Sally'),
                 Word=c('time', 'good', 'like', 'time', 'good', 'like', 'time', 'good', 'like'),
                 Total=c(1,2,4,2,4,3,2,4,4),
                 AllTotal=c(5,10,11,5,10,11,5,10,11))

我需要某种合并或匹配的代码,以便每当df2中的'word'与df中的'word'匹配时,就会在df(AllTotal)中创建一个新列,该列将放置df2中的相应AllTotal值。

我的实际数据集不能像示例中那样以一致的方式运行,所以我不能只重复示例中的AllTotal值。

我是R和编码的新手,所以我不知道所有适当的术语。我希望我所提供的示例对我的要求有意义。我已经尝试过各种版本的merge,inner_join和for循环,但似乎无法获得正确的答案。由于我不知道我要做什么才合适,因此我的搜索无济于事。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

正如@thelatemail在其评论中指出的那样,CharacterWord的内部联接似乎解决了您的主要问题:

  

result <- merge(df,df2,by=c("Character","Word"))

您可以使用Book列中的值对列进行重新排序,

  

result <- result[order(result$Book),c(3,1,4,2,5,6)]