【问题标题】:efficiently match values and average column where TRUE有效地匹配 TRUE 的值和平均列
【发布时间】:2015-09-22 20:52:40
【问题描述】:

当这些值在 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 在 df$number 中,则将每个相应的评分相加并除以一个或多个评分。因此,在这种情况下,p1_games 的输出将是1078。我觉得这真的很简单,但不能完全做到这一点。

【问题讨论】:

  • 在使用随机数据制作示例时请使用set.seed。而且,即使您无法为所需的输出编写工作代码,最好显示您的示例所需的输出是什么。 (这可能意味着将示例的大小减小到可以手动计算结果的位置。)
  • 除了弗兰克所说的,您对两个示例p*_games 向量的预期输出究竟是什么?
  • 抱歉没有更清楚。我进行了修改,希望能真正简化这一点。

标签: r matching


【解决方案1】:

%in% 擅长这种事情

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 2015-05-03
      • 2014-02-11
      • 2022-11-16
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多