两个单独列中的名称累计计数

时间:2017-07-27 13:59:50

标签: r

我有一个按时间顺序排列的数据集,我使用以下方法导入R:

mydata <- read.csv(file="test.csv",stringsAsFactors=FALSE)

数据集中的两列是“赢家”和“输家”。数据中的每一行都是网球比赛。

我要做的是添加两列,这些列给出了“赢家”栏中玩家参与的总匹配数的累积计数,包括该行的匹配。对于该行中的“失败者”,同样重要。

所以例如它看起来像这样:

winner loser winner_matches loser_matches
tom    andy        1             1
andy   greg        2             1
greg   tom         2             2

我希望这是有道理的。

我已尝试使用以下代码,但无法在两个列中使用它:

ave(mydata$winner_name==mydata$winner_name, mydata$winner_name, FUN=cumsum)

所以下面的数据是大约20,000的前10行。

this is how mydata looks

3 个答案:

答案 0 :(得分:3)

1)base 定义一个函数,该函数计算指定玩家的第i行匹配,然后分别将其应用于赢家和输家匹配。没有使用包裹:

count_matches <- function(i, player) {
    with(DF[1:i, ], sum(winner == player | loser == player))
}
n <- nrow(DF)
transform(DF, winner_matches = mapply(count_matches, 1:n, winner),
              loser_matches = mapply(count_matches, 1:n, loser))

,并提供:

  winner loser winner_matches loser_matches
1    tom  andy              1             1
2   andy  greg              2             1
3   greg   tom              2             2

2)sqldf 使用sqldf可以获得一个不同的解决方案,因为我意识到这个问题可以通过这样的复杂条件下的自连接来解决:

library(sqldf)
sqldf("select a.winner, 
              a.loser, 
              sum(a.winner = b.winner or a.winner = b.loser) winner_matches,
              sum(a.loser = b.winner or a.loser = b.loser) loser_matches
       from DF a join DF b on a.rowid >= b.rowid
       group by a.rowid")

,并提供:

  winner loser winner_matches loser_matches
1    tom  andy              1             1
2   andy  greg              2             1
3   greg   tom              2             2

注意:以可重现的形式使用的输入是:

Lines <- "winner loser 
tom    andy
andy   greg
greg   tom"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)

答案 1 :(得分:0)

我们可以通过data.table套餐获得每位玩家赢或输的次数:

library(data.table)
setDT(dat)[, winner_matches_won := seq_len(.N), by=(winner)]
setDT(dat)[, loser_matches_lost := seq_len(.N), by=(loser)]

dat

#    winner loser winner_matches_won loser_matches_lost 
# 1:    tom  andy                  1                  1 
# 2:   andy  greg                  1                  1 
# 3:   greg   tom                  1                  1 
# 4:   greg   tom                  2                  2 
# 5:    tom  greg                  2                  2

<强> 数据:

dat <- structure(list(winner = structure(c(3L, 1L, 2L, 2L, 3L), .Label = c("andy", 
                                                                           "greg", "tom"), class = "factor"), loser = structure(c(1L, 2L, 
                                                                                                                                  3L, 3L, 2L), .Label = c("andy", "greg", "tom"), class = "factor")), .Names = c("winner", 
                                                                                                                                                                                                                 "loser"), class = "data.frame", row.names = c(NA, -5L))

答案 2 :(得分:-1)

你真的很接近让php5enmod mysqli工作。 service apache2 restart函数不知道如何处理文本,因此我为每行创建了一个等于1的虚拟列。这样可以计算ave

这是一个示例数据框。

cumsum

这是添加两个新列的代码。

cumsum