我在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也赢了多少场。
任何帮助都将不胜感激。

最佳答案

首先使用id1id2组合组建一个团队。minmaxid1id2将用于为团队创建组合。意思是id1=100, id2=200id1=200, id2=100应该被认为是同一个团队。
然后计算id1成员赢了多少次,以及min成员赢了多少次。使用id2查找当前行之前的获胜次数。现在一个队获胜的次数应该放在右栏maxdplyr::lag表示HTH1id1表示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/

10-12 20:07