对两个不同数据框中的匹配值求和

时间:2019-07-03 22:39:36

标签: r

R和编码一般来说是新手。我的直觉是,这应该有一个非常基本的答案,因此,如果这太基础而无法花时间学习,请随时将我带回基础入门班。

为了使事情变得容易,我将把我的问题减少到具有相同显着特征的更为简单的情况。

我有两个数据框。第一个显示有些人玩过“白色”游戏。第二个显示一些人为“黑色”支付的游戏数量。有些球员既扮演白人又扮演黑人,而另一些则只扮演其中一种角色。

我想将这两个数据框合并为一个,以显示所有曾扮演任一角色的球员以及他们打了多少场比赛,无论是白人还是黑人。

可复制的示例:

"SELECT C, COUNT(C), AVG(G), AVG(E) GROUP BY C ORDER BY COUNT(C) DESC FORMAT AVG(G) '##0.00', AVG(E) '##0.00' LABEL COUNT(C) 'My count'"

我如何获得一个合并的数据集,以显示所有6位玩家玩过的白色或黑色游戏总数?

谢谢!

1 个答案:

答案 0 :(得分:0)

为了可重复性,最好指定一个随机种子,这样,每次运行该示例时,对于其他示例而言,该示例均相同。我还建议使用stringsAsFactors = FALSE,以便将名称视为字符而不是因素,这会使此过程变得简单一些。 (编辑:但是在默认情况下,它在这里也应该可以正常工作。)

set.seed(0)
player_as_white <- c('John', 'Max', 'Grace', 'Zoe', 'Peter')
games_white <- c(sample(1:20,5))
dat1 <- data.frame(player_as_white, games_white, stringsAsFactors = FALSE)
player_as_black <- c('John', 'Eddie', 'Zoe')
games_black <- c(sample(1:20, 3))
dat2 <- data.frame(player_as_black, games_black, stringsAsFactors = FALSE)

然后我们可以使用merge来将两者结合起来:

merge(dat1, dat2, by.x = "player_as_white", by.y = "player_as_black", all = T)

#  player_as_white games_white games_black
#1           Eddie          NA          18
#2           Grace           7          NA
#3            John          18           5
#4             Max           6          NA
#5           Peter          15          NA
#6             Zoe          10          19

或者使用dplyr解决方案,该解决方案保留来自dat1的订单

library(dplyr)
full_join(dat1, dat2, by = c("player_as_white" = "player_as_black"))

#  player_as_white games_white games_black
#1            John          18           5
#2             Max           6          NA
#3           Grace           7          NA
#4             Zoe          10          19
#5           Peter          15          NA
#6           Eddie          NA          18