Загрузить библиотеку

library(engsoccerdata)
library(dplyr)
library(lubridate)

Извлечение данных Ливерпуля из данных лиги Англии

england$Date <- ymd(england$Date)
Liverpool.home <- england %>% filter(Date > '2001-08-01', home == 'Liverpool')
Liverpool.away <- england %>% filter(Date > '2001-08-01', visitor == 'Liverpool')

Сделайте переменные точки

Liverpool.home$points = 0

for(i in 1:nrow(Liverpool.home)){

  if(Liverpool.home[i,]$result == 'H'){
    Liverpool.home[i,]$points = 3
  }
  else if(Liverpool.home[i,]$result == 'D'){
    Liverpool.home[i,]$points = 1
  }

}

Я знаю, как использовать функцию apply - это действительно скучно и часто возникает вопрос в stackoverflow, однако я не могу решить эту проблему с помощью функции apply. Есть ли способ? :)

-1
golden_truth 6 Сен 2016 в 17:02

3 ответа

Лучший ответ

dplyr

Функция case_when ("векторизованный набор if и else ifs") из dplyr эквивалента оператора SQL CASE WHEN. Нам нужно использовать .$ внутри mutate.

library(dplyr)
Liverpool.home %>% 
  mutate(points = case_when(.$result == 'H' ~ 3,
                            .$result == 'D' ~ 1,
                            TRUE ~ 0))

< Сильный > sqldf

Оператор CASE WHEN в SQL из sqldf:

library(sqldf)
df <- sqldf('SELECT result, 
                     CASE WHEN result = "H" THEN 3 
                          WHEN result = "D" THEN 1
                          ELSE 0
                     END AS points
             FROM [Liverpool.home]')
head(df)

Выход:

  result points
1      A      0
2      A      0
3      H      3
4      D      1
5      H      3
6      H      3
2
mpalanco 6 Сен 2016 в 20:58

Итак, вы хотите перекодировать один из столбцов символьного типа в столбец целых чисел. Один из вариантов - просто использовать ifelse, который векторизован и удобен для использования в этом случае, и вы не хотите использовать apply, который предназначен для циклического прохождения matrix:

Liverpool.home$points <- with(Liverpool.home, ifelse(result == "H", 3, 
                                                     ifelse(result == "D", 1, 0)))

head(Liverpool.home[c("result", "points")])

#  result points
#1      A      0
#2      A      0
#3      H      3
#4      D      1
#5      H      3
#6      H      3
2
Psidom 6 Сен 2016 в 14:10

Попробуй это.

transform(Liverpool.home, points = 3 * (result == "H") + (result == "D"))
0
G. Grothendieck 6 Сен 2016 в 17:14