Найти способ подсчитать футбол / футбольные пассы в R - PullRequest
2 голосов
/ 05 мая 2019

Я пытаюсь найти способ сделать последовательность пасов и показать, сколько раз каждый игрок переходит к другому игроку.

Так, например, если последовательность проходов была такой: от Джордана до Эммы, от Молли до Эмили плохой, это означает, что пасы Джордана и Эммы были успешными, но проходы Молли не были.несколько строк данных, которые я помещаю в 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                         

* Я не знаю, как вставить скриншот, поэтому копирование и вставка испортили форматирование, но вы все равно можете понять, как я хочу, чтобы он выглядел.

Если Мэнди перешел кГрей, и это было хорошо, на пересечении Мэнди и Грей-Г должно быть 1.Если Мэнди перешла к Грейу, и это было плохо, на пересечении Мэнди и Грей-Б должна быть цифра 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 голосов
/ 06 мая 2019

Кажется, вы уже проделали большую работу, поэтому я просто добавлю два моих цента. Как правило, ваш стол будет меньше, если вы не разделите хорошее и плохое на две таблицы. Как правило, у вас может быть одна таблица с комбинациями игроков, которые вы создали, но добавьте столбец с 1 или 0, указывающий, был ли проход хорошим или плохим, и в этом случае вы могли бы просто иметь код выше, но с

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

Это добавляет столбец с 1, если в строке есть «плохо». Представьте себе сложность хорошего и плохого стола за несколько десятилетий и разных игроков!

0 голосов
/ 05 мая 2019

Вы можете использовать регулярные выражения.А также это будет быстро, если вы поместите данные только тех, кто коснулся мяча.Так что-то вроде:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...