Загрузить библиотеку
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. Есть ли способ? :)
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
Итак, вы хотите перекодировать один из столбцов символьного типа в столбец целых чисел. Один из вариантов - просто использовать 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
Попробуй это.
transform(Liverpool.home, points = 3 * (result == "H") + (result == "D"))
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.