Создание новых столбцов для последовательных ИСТИН в R - PullRequest
0 голосов
/ 24 апреля 2018

Я хочу создать новые столбцы, которые устанавливают значение ИСТИНА, если число последовательных побед равно двум, трем и т. Д. Поэтому я хотел бы, чтобы строки 3, 6, 7, 8 были ИСТИНА в новом столбце под названием «twoconswins» и строке 7 , 8, чтобы быть правдой в новом столбце под названием «триконсвинс» и так далее. Каков наилучший способ сделать это?

>         id        date team teamscore opponent opponentscore home   win
>9         9 2005-10-05  DET         5      STL             1    1  TRUE
>38       38 2005-10-09  DET         6      CAL             3    1  TRUE
>48       48 2005-10-10  DET         2      VAN             4    1 FALSE
>88       88 2005-10-17  DET         3      SJS             2    1  TRUE
>110     110 2005-10-21  DET         3      ANA             2    1  TRUE
>148     148 2005-10-27  DET         5      CHI             2    1  TRUE
>179     179 2005-11-01  DET         4      CHI             1    1  TRUE
>194     194 2005-11-03  DET         3      EDM             4    1 FALSE
>212     212 2005-11-05  DET         1      PHO             4    1 FALSE

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Если вы также хотите автоматически создавать новые столбцы, в случае, если иногда случается 500 последовательных побед, вы можете сделать это:

df <- read.table(text =
                      'id   date     team teamscore opponent opponentscore home   win
             9         9 2005-10-05  DET         5      STL             1    1  TRUE
             38       38 2005-10-09  DET         6      CAL             3    1  TRUE
             48       48 2005-10-10  DET         2      VAN             4    1  FALSE
             88       88 2005-10-17  DET         3      SJS             2    1  TRUE
             110     110 2005-10-21  DET         3      ANA             2    1  TRUE
             148     148 2005-10-27  DET         5      CHI             2    1  TRUE
             179     179 2005-11-01  DET         4      CHI             1    1  TRUE
             194     194 2005-11-03  DET         3      EDM             4    1 FALSE
             212     212 2005-11-05  DET         1      PHO             4    1 FALSE',
 header = TRUE)



rles <- data.frame(values = c(rle(df$win)$values), 
                   lengths = c(rle(df$win)$lengths))

maxconwins <-  max(rles[rles$values == TRUE,]) 

for(x in 1: maxconwins){
  x <- seq(1,x)
  partialstring <- paste("shift(df$win,", x, ",NA)", collapse = " & ")
  fullstring <- paste0("df$nr", max(x), "conswins <-  (", partialstring, ") == TRUE")
  eval(parse(text = fullstring))
}

df[1:maxconwins,9:12][upper.tri(df[1:maxconwins,9:12], diag = TRUE)] <- NA

   > df[,8:12]
      win nr1conswins nr2conswins nr3conswins nr4conswins
9    TRUE          NA          NA          NA          NA
38   TRUE        TRUE          NA          NA          NA
48  FALSE        TRUE        TRUE          NA          NA
88   TRUE       FALSE       FALSE       FALSE          NA
110  TRUE        TRUE       FALSE       FALSE       FALSE
148  TRUE        TRUE        TRUE       FALSE       FALSE
179  TRUE        TRUE        TRUE        TRUE       FALSE
194 FALSE        TRUE        TRUE        TRUE        TRUE
212 FALSE       FALSE       FALSE       FALSE       FALSE

Кстати, я только добавил последнюю строку, потому что (FALSE & TRUE & TRUE & NA) == TRUE оценивается как FALSE, в то время как вы, вероятно, хотели бы, чтобы эти ячейки были NA. Я просто убедился в этом здесь, установив верхний триагонал симметричной подматрицы впоследствии на NA. Для удобства чтения я вручную добавил сюда столбцы с номерами 9 и 12, но вы также можете указать те, у которых есть функция, если хотите.

UPDATE: При использовании функции Reduce (), предложенной Фрэнком, вы можете сделать это для цикла вместо вышеупомянутого:

for(x in 1: maxconwins){
 x <- seq(1,x)
 eval(parse(text = paste0("df$nr", max(x), "conswins <- (Reduce(`&`, shift(df$win, 1:", max(x), "))) == TRUE")))
 }
0 голосов
/ 24 апреля 2018

Я предположил, что строка 1 должна быть заголовком, поэтому строки 2, 5, 6 и 7 должны иметь значение TRUE для "twoconswins", а строки 6 и 7 для "threeconswins".

Вы можете сделать:

library(data.table)
df$twoconswins <-  (df$win & shift(df$win, 1, NA)) == TRUE
df$threeconswins <- (df$win & shift(df$win, 1, NA) & shift(df$win, 2, NA)) == TRUE

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...