在R

时间:2019-05-04 22:22:27

标签: r

我正在尝试寻找一种方法来进行一系列传球,并显示每个玩家传给另一位玩家的次数。

因此,例如,如果通过顺序为:乔丹到艾玛,莫莉到艾米丽,那就不好了,这意味着乔丹和艾玛的通行成功了,但莫莉却没有。

我有一个例子,我将几行数据放入R(在2x2数据集中):

  Passes
1 jordan to karlie karlie turnover unforced
2 jlin to gray bad
3 alia to kiersten to lilly to kiersten bad
4 mandy to karlie bad
5 kelsey to mccarter to jordan to emma emma fouled
6 mandy to karlie bad
7 mandy to kiersten cleared

我试图提出一种可以将这些行转换成这样的表的方法:

Players Mandy-G Jlin-G Gray-G Kiersten-G Kelsey-G Karlie-G Jordan-G Lilly-G Mccarter-G Emma-G Alia-G Mandy-B Jlin-B Gray-B Kiersten-B Kelsey-B Karlie-B Jordan-B Lilly-B Mccarter-B Emma-B Alia-B
Mandy                             1                                                                                                              2
Jlin                                                                                                                   1
Gray
Kiersten                                                               1
Kelsey                                                                          1
Karlie
Jordan                                               1                                    1
Lilly                                                                                                                          1
McCarter                                                      1
Emma
Alia                              1                         

*我不知道如何插入屏幕截图,因此复制和粘贴弄乱了格式,但是您仍然可以了解我想要的外观。

如果Mandy传递给Gray,那很好,那么Mandy和Gray-G的交点应该为1。如果曼迪(Mandy)传给格雷(Gray),但情况很糟糕,那么曼迪(Mandy)和格雷(Gray-B)的交点应该为1。

该表中只有数字,因为我是手工完成的,并且只进行了大约10分钟的游戏。最终,在整个90分钟内完成约25场比赛,我将需要创建一种方法来通过第一张桌子并进行R排序,并为每次成功和不成功的传递加分。

dat3 <- strsplit(dat[,1], "to")
numPass <- rep(0, length(dat3))

for (i in 1:length(dat2)) {
  temp <- sum(dat2[[i]] == "to")
  if ("bad" %in% dat2[[i]]) {
    temp <- temp-1
  }
  numPass[i] <- temp
}
maxPass <- max(numPass)+1


#for (i in 1:length(dat2)){
for (i in 5){
  keep<-dat2[[i]]%in%roster[,1]
  pls<-dat2[[i]][keep]
  #add statemets to remove last name if there is a "bad"
  for (j in 1:length(pls)) {
      cols<-which(substr(names(seqPass),1,nchar(pls[j]))==pls[j])
      seqPass[i,cols[j]]<-j

  }
}

seqPass[c(1,5),]

我已经尝试了上面的代码来遍历前五行并计算每个序列中的传球次数,并且如果每个人都参与了传球,它将在每个球员的名字下添加一个标记,但是如果不好,他们需要被删除,这是不行的。

R是否有一种方法可以自动计算序列中的名字和名字是否通过,在其交点处添加一个标记,并且如果名字和名字通过不当,也可以这样做第二个名字后面有“坏”一词?

任何帮助将不胜感激! 谢谢

样本数据

structure(list(VT = c("jordan to karlie karlie turnover unforced", 
"jlin to gray bad", "alia to kiersten to lilly to kiersten bad", 
"mandy to karlie bad", "kelsey to mccarter to jordan to emma emma fouled", 
"mandy to karlie bad", "mandy to kiersten cleared bad")), row.names = c(NA, 
7L), class = "data.frame", na.action = structure(8:19, .Names = c("8", 
"9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"
), class = "omit"))

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式。而且,如果仅输入碰到球的人的数据,它将很快。像这样:

pass = sub('_$','_good',sub("(.*\\w+ to (?:\\w+(?=.*(bad))|\\w+)).*",'\\1_\\2',dat$VT,perl = T))
pass1 = gsub('(to(\\s[^_ ]+(?=\\s)))','\\1_good\n\\2',pass,perl=T)
results = xtabs(V3~.,cbind(read.csv(text=gsub('to',',',pass1),h=F,strip.white = T),V3=1))

results
          V2
V1         emma_good gray_bad jordan_good karlie_bad karlie_good kiersten_bad kiersten_good lilly_good mccarter_good
  alia             0        0           0          0           0            0             1          0             0
  jlin             0        1           0          0           0            0             0          0             0
  jordan           1        0           0          0           1            0             0          0             0
  kelsey           0        0           0          0           0            0             0          0             1
  kiersten         0        0           0          0           0            0             0          1             0
  lilly            0        0           0          0           0            1             0          0             0
  mandy            0        0           0          2           0            1             0          0             0
  mccarter         0        0           1          0           0            0             0          0             0

答案 1 :(得分:-1)

看来您已经做了很多工作,所以我只加两分钱。如果您没有将好坏分为两个表,则通常会使表变小。通常,您可以有一张表,其中包含与您创建的玩家组合在一起的表,但要添加一列1或0来说明传递的好坏,在这种情况下,您可以将代码放在上面,但使用

dat$pass <- as.numeric(grepl(".*(bad)", dat$VT))

如果行中包含“ bad”,则会在其中添加1。想象一下几十年来好坏的桌子和不同的参与者的复杂性!