我有一个按时间顺序排列的数据集,我使用以下方法导入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行。
答案 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