我在r中的数据库是15k行,我需要帮助来计算数据中的一些值。
这里是我数据库的前8行。
day <- c(1,2,3,4,5,6,7,8)
id1 <- c(100,200,100,400,200,200,300,200)
id2 <- c(200,400,200,300,400,100,400,100)
result<-c(1,0,1,0,1,0,0,1)
tables <- data.frame(day,id1,id2,result)
这就是我要找的:
day <- c(1,2,3,4,5,6,7,8)
id1 <- c(100,200,100,400,200,200,300,200)
id2 <- c(200,400,200,300,400,100,400,100)
result<-c(1,0,1,0,1,0,0,1)
HTH1 <- c(0,0,1,0,0,0,1,0)
HTH2 <- c(0,0,0,0,1,2,0,3)
tables <- data.frame(day,id1,id2,result,HTH1,HTH2)
“结果”中的0表示ID1输掉了比赛,1表示他赢了。
我想知道之前ID1和ID2的比赛赢了多少场(在那一排之前),ID2也赢了多少场。
任何帮助都将不胜感激。
最佳答案
首先使用id1
和id2
组合组建一个团队。min
和max
的id1
和id2
将用于为团队创建组合。意思是id1=100, id2=200
和id1=200, id2=100
应该被认为是同一个团队。
然后计算id1
成员赢了多少次,以及min
成员赢了多少次。使用id2
查找当前行之前的获胜次数。现在一个队获胜的次数应该放在右栏max
中dplyr::lag
表示HTH1
和id1
表示HTH2
以获得期望的结果。
library(dplyr)
tables %>% rowwise() %>%
mutate(minId = min(id1,id2), maxId = max(id1,id2)) %>%
ungroup() %>%
group_by(minId, maxId) %>%
mutate(WinOfMin = lag(cumsum(ifelse(id1<id2, result==1, result==0)),default = 0)) %>%
mutate(WinOfMax = lag(cumsum(ifelse(id1<id2, result==0, result==1)),default = 0)) %>%
mutate(HTH1 = ifelse(id1==minId, WinOfMin, WinOfMax )) %>%
mutate(HTH2 = ifelse(id2==maxId, WinOfMax, WinOfMin )) %>%
ungroup() %>%
select(-minId,-maxId, -WinOfMin,-WinOfMax) %>%
as.data.frame()
# day id1 id2 result HTH1 HTH2
# 1 1 100 200 1 0 0
# 2 2 200 400 0 0 0
# 3 3 100 200 1 1 0
# 4 4 400 300 0 0 0
# 5 5 200 400 1 0 1
# 6 6 200 100 0 0 2
# 7 7 300 400 0 1 0
# 8 8 200 100 1 0 3
关于r - R中的计数器功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50397801/