Заменить на L oop, чтобы заполнить столбец в зависимости от другого значения столбца - PullRequest
2 голосов
/ 03 мая 2020

У меня есть два столбца данных (HOME & AWAY) под названием «список игр» со спортивными играми. Столбец HOME также содержит некоторые даты с соответствующими играми, перечисленными ниже.

HOME               AWAY  
15 Oct 2019        Pre-season  
Phoenix Suns       Denver Nuggets
Utah Jazz          Sacramento Kings
Dallas Mavericks   Oklahoma City Thunder
Memphis Grizzlies  Charlotte Hornets
14 Oct 2019        Pre-season
Miami Heat         Atlanta Hawks
13 Oct 2019        Pre-season
Orlando Magic      Philadelphia 76ers
Toronto Raptors    Chicago Bulls
Washington Wizards Milwaukee Bucks

Я хочу создать новый столбец с датами для каждой игры. Исходя из подхода Excel vba, я использовал для l oop, который дает желаемый результат, но мне было интересно, есть ли более эффективный подход в R, и я уверен, что есть.

Это код, который я использовал:

gamelist<-add_column(gamelist,SDATE="",.before = 1)
for(i in 1:nrow(gamelist)){
  if(str_count(gamelist[[i,3]],"\\d")==6){
    gamelist[i,2]<-gamelist[i,3]

  }else{
    gamelist[i,2]<-gamelist[i-1,2]  
  }
}

, который дает мне это, как задумано

SDATE              HOME               AWAY 
15 Oct 2019        15 Oct 2019        Pre-season  
15 Oct 2019        Phoenix Suns       Denver Nuggets
15 Oct 2019        Utah Jazz          Sacramento Kings
15 Oct 2019        Dallas Mavericks   Oklahoma City Thunder
15 Oct 2019        Memphis Grizzlies  Charlotte Hornets
14 Oct 2019        14 Oct 2019        Pre-season
14 Oct 2019        Miami Heat         Atlanta Hawks
13 Oct 2019        13 Oct 2019        Pre-season
13 Oct 2019        Orlando Magic      Philadelphia 76ers
13 Oct 2019        Toronto Raptors    Chicago Bulls
13 Oct 2019        Washington Wizards Milwaukee Bucks

Мои извинения за форматирование кадра данных, не могу понять как правильно воспроизвести один здесь. Спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Мы могли бы использовать str_extract, чтобы получить только «даты», так что, если нет совпадения, он возвращает NA, тогда мы используем fill, чтобы заполнить элементы NA предыдущими значениями, отличными от NA

library(dplyr)
library(tidyr)
library(stringr)
gamelist %>%
      mutate(SDATE = str_extract(HOME, "^\\d+ [A-Za-z]+ \\d{4}")) %>%
      fill(SDATE)
#             HOME                  AWAY       SDATE
#1         15 Oct 2019            Pre-season 15 Oct 2019
#2        Phoenix Suns        Denver Nuggets 15 Oct 2019
#3           Utah Jazz      Sacramento Kings 15 Oct 2019
#4    Dallas Mavericks Oklahoma City Thunder 15 Oct 2019
#5   Memphis Grizzlies     Charlotte Hornets 15 Oct 2019
#6         14 Oct 2019            Pre-season 14 Oct 2019
#7          Miami Heat         Atlanta Hawks 14 Oct 2019
#8         13 Oct 2019            Pre-season 13 Oct 2019
#9       Orlando Magic    Philadelphia 76ers 13 Oct 2019
#10    Toronto Raptors         Chicago Bulls 13 Oct 2019
#11 Washington Wizards       Milwaukee Bucks 13 Oct 2019

Если нам сначала нужен столбец SDATE, мы можем использовать select

gamelist %>%
      mutate(SDATE = str_extract(HOME, "^\\d+ [A-Za-z]+ \\d{4}")) %>%
      fill(SDATE) %>%
      select(SDATE, everything())

или использовать add_column из tibble с .after или .before

library(tibble)
gamelist %>%
    add_column(SDATE = str_extract(.$HOME, "^\\d+ [A-Za-z]+ \\d{4}"), 
            .before = 1 ) %>% 
    fill(SDATE)

данные

gamelist <- structure(list(HOME = c("15 Oct 2019", "Phoenix Suns", "Utah Jazz", 
"Dallas Mavericks", "Memphis Grizzlies", "14 Oct 2019", "Miami Heat", 
"13 Oct 2019", "Orlando Magic", "Toronto Raptors", "Washington Wizards"
), AWAY = c("Pre-season", "Denver Nuggets", "Sacramento Kings", 
"Oklahoma City Thunder", "Charlotte Hornets", "Pre-season", "Atlanta Hawks", 
"Pre-season", "Philadelphia 76ers", "Chicago Bulls", "Milwaukee Bucks"
)), class = "data.frame", row.names = c(NA, -11L))
0 голосов
/ 03 мая 2020

Если в столбце HOME всегда указана дата, когда в столбце AWAY указано «Предсезонное» (или какое-либо другое предсказуемое условие), то вы можете сделать что-то вроде:

# data
gamelist <- data.frame(
  stringsAsFactors = FALSE,
              HOME = c("15-Oct-19","Phoenix Suns",
                       "Utah Jazz","Dallas Mavericks","Memphis Grizzlies",
                       "14-Oct-19","Miami Heat","13-Oct-19","Orlando Magic",
                       "Toronto Raptors","Washington Wizards"),
              AWAY = c("Pre-season","Denver Nuggets",
                       "Sacramento Kings","Oklahoma City Thunder",
                       "Charlotte Hornets","Pre-season","Atlanta Hawks","Pre-season",
                       "Philadelphia 76ers","Chicago Bulls","Milwaukee Bucks")
)

# create blank column to fill in 
gamelist$date <- NA
# fill cases where there's a date 
gamelist$date[gamelist$AWAY=="Pre-season"] <- gamelist$HOME[gamelist$AWAY=="Pre-season"]
# user zoo::na.locf() to fill in missing values
gamelist$date <- zoo::na.locf(gamelist$date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...