当这些值在r中有效匹配时,在匹配值和取一列的平均值时遇到麻烦。本质上,我有一个象棋表,我从中提取了数据,并希望根据他们的对手获得每个玩家在下棋前的平均评分。
如果我有一个数据帧:
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中的值是否与表中的某个数字匹配,如果匹配,则对评级列中的值求平均值。我只想返回一个值,所以我在尝试使ifelse()工作时遇到了麻烦:
avg_rate <- ifelse(p1_games %in% df$number, sum(df$rating)/length(p1_games)) #not working
我希望尽可能避免循环,但如果没有其他有效的方法,也没关系。只是不知道这上面有什么。理想情况下,我希望将这种逻辑应用于许多p*_games向量。
如果p1_games in df$number,将每个对应的评分相加并除以评分数。所以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