编辑:我写了一个非结构化的问题,让我再试一次。
我想为下面的数据集创建两个新列winner_total_points
和loser_total_points
。
winner <- c(1,2,3,4,1,2)
loser <- c(2,3,1,3,3,1)
winner_points <- c(5,4,12,2,1,6)
loser_points <- c(5,2,2,6,6,2)
test_data <- data.frame(winner, loser, winner_points, loser_points)
我希望这两个专栏要做的是winner_total_points
将获胜者获得的所有积分(不包括此匹配)加为赢家和输家。
loser_total_points
的功能与失败者相同。
请注意,winner
和loser
列包含相应的播放器ID。
现在,使用ave()
函数相当容易,但这只适用于仅对列进行分组并对一列执行累计求和。
期望的输出:
winner loser winner_points loser_points winner_total loser_total
1 2 5 5 5 5
2 3 4 2 9 (5+4) 2
3 1 12 2 14 (2+12) 7 (5+2)
4 3 2 6 2 20 (2+12+6)
1 3 1 6 8 (5+2+1) 26 (2+12+6+6)
2 1 6 2 15 (5+4+6) 10 (5+2+1+2)
答案 0 :(得分:1)
我也很难理解,但也许这个......?
users: (_, args, context, ast) => {
const { onlyNonNullEmail } = args;
// If onlyNonNullEmail is true, return only users with a non-null email
// Else proceed as usual
}
答案 1 :(得分:0)
如果我正确理解了OP的要求,他想按玩家ID计算积分的累计总和,无论是wins_points还是loser_points。这里重点是要注意winner
和loser
列包含各自的玩家ID。
下面的解决方案将数据从宽格式转换为长格式,从而同时重塑两个值变量,计算每个玩家ID的累积总和,最后再次从长格式再格式化为宽格式。
library(data.table
cols <- c("winner", "loser")
setDT(test_data)[
# append row id column required for subsequent reshaping
, rn := .I][
# reshape multiple value variables simultaneously from wide to long format
, melt(.SD, id.vars = "rn",
measure.vars = list(cols, paste0(cols, "_points")),
value.name = c("id", "points"))][
# rename variable column
, variable := forcats::lvls_revalue(variable, cols)][
# order by row id and compute cumulative points by id
order(rn), total := cumsum(points), by = id][
# reshape multiple value variables simultaneously from long to wide format
, dcast(.SD, rn ~ variable, value.var = c("id", "points", "total"))]
rn id_winner id_loser points_winner points_loser total_winner total_loser 1: 1 1 2 5 5 5 5 2: 2 2 3 4 2 9 2 3: 3 3 1 12 2 14 7 4: 4 4 3 2 6 2 20 5: 5 1 3 1 6 8 26 6: 6 2 1 6 2 15 10
编辑:以上结果与OP发布的预期结果一致。 它包括得分包括实际匹配。同时,the OP has posted a similar question预期结果排除实际匹配。