我的数据包含足球比赛结果的统计数据,包含12806次观察(比赛结果)和34项关键绩效指标。
我的data.frame的一个(小)示例如下:
head(Test)
MatchID Outcome Var1 Var2 Var3 Var4 Var5
1 30 Loss 0 10 0 10 0
2 30 Win 6 13 6 13 6
3 31 Loss 8 12 3 6 3
4 31 Win 29 40 9 19 3
5 32 Loss 7 26 7 26 6
6 32 Win 11 20 11 20 9
对于每个独特的"匹配ID"我希望从胜利(Outcome ==" Win")团队中扣除每一个失败(结果=="损失"关键绩效指标。)我的数据集并不总是由损失,胜利,损失,胜利,所以连续完成这个方式可能是不可能的。
我使用dplyr尝试了以下内容:
Differences <- Test %>%
group_by(MatchID) %>%
summarise_at( .vars = names(.)[3:7], ((Outcome == "Win") - (Outcome == "Loss")))
但是我担心我使用了错误的方法,因为我收到了以下错误:Error in inherits(x, "fun_list") : object 'Outcome' not found
我的预期结果将是:
head(AnticipatedOutcome)
MatchID Var1 Var2 Var3 Var4 Var5
1 30 6 3 6 3 6
3 31 21 28 6 13 0
5 32 4 -6 4 -6 3
请使用dplyr来实现吗?
答案 0 :(得分:4)
两个逻辑向量的差异具有相同的长度。我们需要将&#39; Var&#39;列的结果&#39;结果&#39;是"Win"
,取sum
的{{1}}并将其从“结果”中删除。是"Loss"
library(tidyverse)
Test %>%
group_by(MatchID) %>%
summarise_at(vars(starts_with('Var')),
funs(sum(.[Outcome == "Win"]) - sum(.[Outcome == "Loss"])))
# A tibble: 3 x 6
# MatchID Var1 Var2 Var3 Var4 Var5
# <int> <int> <int> <int> <int> <int>
#1 30 6 3 6 3 6
#2 31 21 28 6 13 0
#3 32 4 -6 4 -6 3
或另一种选择是gather
进入&#39; long&#39;格式,按sum
和spread
之间的差异来获取广告组&#39;格式
Test %>%
gather(key, val, Var1:Var5) %>%
group_by(MatchID, key) %>%
summarise(val = sum(val[Outcome == "Win"]) - sum(val[Outcome == "Loss"])) %>%
spread(key, val)
答案 1 :(得分:1)
可以使用带有data.table
参数的.SDcols
来汇总数据。正如@akrun在他的解决方案中提到的,每次比赛都会从sum
的“胜利”中减去sum
的“损失”。
library(data.table)
setDT(df)
df[,lapply(.SD,function(x)sum(x[Outcome=="Win"]) - sum(x[Outcome=="Loss"])),
.SDcols = Var1:Var5,by=MatchID]
# MatchID Var1 Var2 Var3 Var4 Var5
# 1: 30 6 3 6 3 6
# 2: 31 21 28 6 13 0
# 3: 32 4 -6 4 -6 3
注意:仅仅是为了探索不同的想法,但即使base-R
也可以达到相同的结果:
cbind(unique(df[1]), df[order(df$MatchID),][df$Outcome == "Win",3:7] -
df[order(df$MatchID),][df$Outcome == "Loss",3:7])
# MatchID Var1 Var2 Var3 Var4 Var5
# 1 30 6 3 6 3 6
# 3 31 21 28 6 13 0
# 5 32 4 -6 4 -6 3
数据:强>
df <- read.table(text =
"MatchID Outcome Var1 Var2 Var3 Var4 Var5
1 30 Loss 0 10 0 10 0
2 30 Win 6 13 6 13 6
3 31 Loss 8 12 3 6 3
4 31 Win 29 40 9 19 3
5 32 Loss 7 26 7 26 6
6 32 Win 11 20 11 20 9",
header =TRUE, stringsAsFactors = FALSE)