【发布时间】:2017-12-06 15:44:31
【问题描述】:
我之前试过问这个问题,但它是不是说得不好。这是一个新的尝试,因为我还没有解决它。
我有一个包含获胜者、失败者、日期、获胜者点数和失败者点数的数据集。
对于每一行,我想要两个新列,一个用于获胜者,一个用于失败者,显示他们到目前为止获得了多少分(作为获胜者和失败者)。
示例数据:
winner <- c(1,2,3,1,2,3,1,2,3)
loser <- c(3,1,1,2,1,1,3,1,2)
date <- c("2017-10-01","2017-10-02","2017-10-03","2017-10-04","2017-10-05","2017-10-06","2017-10-07","2017-10-08","2017-10-09")
winner_points <- c(2,1,2,1,2,1,2,1,2)
loser_points <- c(1,0,1,0,1,0,1,0,1)
test_data <- data.frame(winner, loser, date = as.Date(date), winner_points, loser_points)
我希望输出是:
winner_points_sum <- c(0, 0, 1, 3, 1, 3, 5, 3, 5)
loser_points_sum <- c(0, 2, 2, 1, 4, 5, 4, 7, 4)
test_data <- data.frame(winner, loser, date = as.Date(date), winner_points, loser_points, winner_points_sum, loser_points_sum)
到目前为止,我解决它的方法是执行一个 for 循环,例如:
library(dplyr)
test_data$winner_points_sum_loop <- 0
test_data$loser_points_sum_loop <- 0
for(i in row.names(test_data)) {
test_data[i,]$winner_points_sum_loop <-
(
test_data %>%
dplyr::filter(winner == test_data[i,]$winner & date < test_data[i,]$date) %>%
dplyr::summarise(points = sum(winner_points, na.rm = TRUE))
+
test_data %>%
dplyr::filter(loser == test_data[i,]$winner & date < test_data[i,]$date) %>%
dplyr::summarise(points = sum(loser_points, na.rm = TRUE))
)
}
test_data$winner_points_sum_loop <- unlist(test_data$winner_points_sum_loop)
有什么建议可以解决这个问题吗?当行号加起来时,查询需要相当长的时间。我已经尝试使用 AVE 函数进行详细说明,我可以在一列中将玩家的分数加起来为赢家,但不知道如何将他们的分数添加为输家。
【问题讨论】:
-
我不明白
winner_points_sum应该是什么。是它上面行中所有winner_points的总和吗?你能澄清一下吗? -
我完全糊涂了。
winner和loser点是什么意思?为什么是赢家 1 和输家 3?你是如何到达winner_points和loser_points的。循环有什么作用?请澄清一些? -
winner_points_sum 应该是他们之前所有比赛中获胜者得分的总和,无论是赢家还是输家。赢家和输家是ID,只是示例,与积分相同。 @MattW @D Pinto
标签: r for-loop cumulative-sum