有效地匹配值和平均列,其中 TRUE

efficiently match values and average column where TRUE

当这些值在 R 中有效匹配时,仅匹配值并取列的平均值时遇到问题。本质上,我有一个国际象棋 table,我已经从中提取数据并希望获得平均值每个棋手的棋前评分基于他们的对手。

如果我有一个数据框:

number <- c(1:10) #number assigned to each player
rating <- c(1000,1200,1210,980,1000,1001,1100,1300,1100,1250) #rating of the player
df <- data.frame(number= number, rating = rating)

p1_games <- c(1,2,3,4,5) # player 1 played against players 2,3,4,5

我基本上想做的是检查 p1_games 中的值是否与 table 中的数字匹配,当它们匹配时,对评分列中的值进行平均。 我只想 return 一个值,所以我在尝试使 ifelse() 工作时遇到了麻烦:

avg_rate <- ifelse(p1_games %in% df$number, sum(df$rating)/length(p1_games)) #not working

我想尽可能避免循环,但如果没有其他有效的方法也没关系。只是想不通这里有什么。理想情况下,我想将此逻辑应用于许多 p*_games 向量。

如果 df$number 中 p1_games,则对每个相应的评分求和,然后除以评分数。因此在这种情况下 p1_games 的 输出将是 1078。我觉得这真的很简单,但不能完全做到这一点。

%in%很擅长这种事情

> mean(df[number %in% p1_games, "rating"])
[1] 1078

使用 data.table 的替代答案,它可能适用于更大的数据集(尽管由于 p1_games 不是列,我不确定):

> setDT(df)
> df[number %in% p1_games, mean(rating)]
[1] 1078