как преобразовать уровни фактора в целое число в г - PullRequest
0 голосов
/ 05 июля 2018

У меня есть следующий фрейм данных в R

  ID      Season      Year       Weekday
  1       Winter      2017       Monday
  2       Winter      2018       Tuesday
  3       Summer      2017       Monday
  4       Summer      2018       Wednsday

Я хочу преобразовать эти уровни факторов в целое число, следующий мой желаемый фрейм данных

  ID      Season      Year       Weekday
  1       1           1          1
  2       1           2          2
  3       2           1          1
  4       2           2          3

  Winter = 1,Summer =2
  2017 = 1 , 2018 = 2
  Monday = 1,Tuesday = 2,Wednesday = 3

В настоящее время я делаю ifelse выше 3

  otest_xgb$Weekday <- as.integer(ifelse(otest_xgb$Weekday == "Monday",1,
                                   ifelse(otest_xgb$Weekday == "Tuesday",2,
                                          ifelse(otest_xgb$Weekday == "Wednesday",3,
                                                 ifelse(otest_xgb$Weekday == "Thursday",4,5)))))

Есть ли способ избежать написания длинных ifelse?

Ответы [ 4 ]

0 голосов
/ 06 июля 2018

Упорядоченные и номинальные переменные фактора необходимо учитывать отдельно . Непосредственное преобразование факторного столбца в целое или числовое значение даст значения в лексикографическом смысле.

Здесь Weekday концептуально порядковый номер , Year равен целое число , Season обычно номинальное значение . Однако это опять-таки субъективно в зависимости от вида необходимого анализа.

Например, При непосредственном преобразовании из фактора в целочисленные переменные. В столбце Weekday значение Wednesday будет больше, чем в субботу и вторник :

 dat[] <- lapply(dat, function(x)as.integer(factor(x)))
 dat 

#  ID Season Year Weekday
#1  1      2    1       1
#2  2      2    2       3
#3  3      1    1       2   (Saturday)
#4  4      1    2       4   (Wednesday): assigned value greater than that ofSaturday        

Таким образом, вы можете напрямую преобразовать фактор в целые числа только для столбцов Season и Year. Можно отметить, что для столбца year он работает нормально, так как лексикографический смысл соответствует его порядковому значению.

dat[c('Season', 'Year')] <- lapply(dat[c('Season', 'Year')], 
                                   function(x) as.integer(factor(x)))

Weekday необходимо преобразовать из упорядоченной факторной переменной с желаемым порядком уровней. Это может быть безвредно, если выполнять общее агрегирование , но радикально влияет на результаты при реализации статистических моделей .

dat$Weekday <- as.integer(factor(dat$Weekday, 
                          levels = c("Monday", "Tuesday", "Wednesday", "Thursday", 
                                     "Friday", "Saturday", "Sunday"), ordered = TRUE))

dat
#  ID Season Year Weekday
#1  1      2    1       1
#2  2      2    2       2
#3  3      1    1       6  (Saturday)
#4  4      1    2       3  (Wednesday): assigned value less than that of Saturday

Используемые данные:

dat <- read.table(text="  ID      Season      Year       Weekday
1       Winter      2017       Monday
2       Winter      2018       Tuesday
3       Summer      2017       Saturday
4       Summer      2018       Wednesday", header = TRUE)
0 голосов
/ 05 июля 2018

Вы можете просто использовать as.numeric(), чтобы преобразовать коэффициент в число. Каждое значение будет изменено на соответствующее целое число, которое представляет этот факторный уровень:

library(dplyr)

### Change factor levels to the levels you specified
otest_xgb$Season  <- factor(otest_xgb$Season , levels = c("Winter", "Summer"))
otest_xgb$Year    <- factor(otest_xgb$Year   , levels = c(2017, 2018))
otest_xgb$Weekday <- factor(otest_xgb$Weekday, levels = c("Monday", "Tuesday", "Wednesday"))

otest_xgb %>% 
  dplyr::mutate_at(c("Season", "Year", "Weekday"), as.numeric)


# ID Season Year Weekday
# 1  1      1    1       1
# 2  2      1    2       2
# 3  3      2    1       1
# 4  4      2    2      NA
0 голосов
/ 05 июля 2018

Мы можем использовать match с unique элементами

library(dplyr)
dat %>%
      mutate_all(funs(match(., unique(.))))
#   ID Season Year Weekday
#1  1      1    1       1
#2  2      1    2       2
#3  3      2    1       1
#4  4      2    2       3
0 голосов
/ 05 июля 2018
m=dat
> m[]=lapply(dat,function(x)as.integer(factor(x,unique(x))))
> m
  ID Season Year Weekday
1  1      1    1       1
2  2      1    2       2
3  3      2    1       1
4  4      2    2       3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...