Как использовать apply для создания нескольких полиномиальных переменных? - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть несколько переменных,

qual_cols <- c("ExterQual", "ExterCond", "BsmtQual", "BsmtCond", "HeatingQC", "KitchenQual", "FireplaceQu", "GarageQual", "GarageCond", "PoolQC")

каждый столбец состоит из одних и тех же пяти значений chr:

grades <- c( "Po", "Fa", "TA", "Gd", "Ex")

, которые я хотел бы оцифровать

"Po" = 1; "Fa" = 2; "TA" = 4  "Gd" = 6 "Ex" = 11

для умножения для создания новых переменных, таких как:

combi$GarageGrade <- combi$GarageQual * combi$GarageCond
combi$ExterGrade <- combi$ExterQual * combi$ExterCond
combi$KitchenScore <- combi$KitchenAbvGr * combi$KitchenQual

Какими способами это можно сделать?

Примечание: я новичок в программировании, поэтому преувеличивание очевидногоприветствуется.

Пример:

head(combi$ExterQual) # (Gd, TA, Gd, TA, Gd, Ta) 

значения-эквиваленты будут (6, 4, 6, 4, 6, 4)

head(combi$ExterCond) # (TA, TA, TA, TA, TA, TA) 

значения-эквиваленты будутбыть (4, 4, 4, 4, 4, 4)

combi$ExterGrade <- combi$ExterQual * combi$ExterCond
head(combi$ExterGrade) # expected output: (24, 16, 24, 16, 24, 16)

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Если имена переменных не согласованы (то есть не только Qual и Cond), это более гибкий подход:

Идентификация переменных с помощью значений Po, Fa, TA, Gd, Ex

qual_cols <- c("ExterQual", "ExterCond", "BsmtQual", "BsmtCond", "HeatingQC", "KitchenQual", "FireplaceQu", "GarageQual", "GarageCond", "PoolQC")

Заменить категории оценок числовыми значениями.

numeric_quals = sapply(combi[qual_cols], function(x) ifelse(x == 'Po', 1, 
                                        ifelse(x =='Fa', 2,
                                        ifelse(x =='TA', 4,
                                        ifelse(x == 'Gd', 6,
                                        ifelse(x == 'Ex', 11, 0))))) )

Заменить (изменить) переменные в кадре данных.

combi = combi %>% select(-qual_cols) %>% cbind(numeric_quals)

Выполнить умножение

Общее качество дома

combi$OverallGrade <- combi$OverallQual * combi$OverallCond
head(combi$OverallGrade)

Общая оценка бассейна

combi$PoolScore <- combi$PoolArea * combi$PoolQC

Общая площадь гаража

combi$AllGarage <- combi$GarageCars * combi$GarageArea

Общее количество ванных комнат

combi$TotalBath <- combi$BsmtFullBath + (0.5 * combi$BsmtHalfBath) + 
  combi$FullBath + (0.5 * combi$HalfBath)

Общая готовая SF для дома(включая подвал)

combi$AllSF <- combi$GrLivArea + combi$TotalBsmtSF

Всего SF для крыльца

combi$AllPorchSF <- combi$OpenPorchSF + combi$EnclosedPorch + 
  combi$X3SsnPorch + combi$ScreenPorch

Комбинированные дополнения

combi$Additions <- combi$YearRemodAdd + as.numeric(combi$GarageYrBlt)
0 голосов
/ 01 декабря 2018

Мы можем использовать именованный вектор, чтобы изменить значения на числовые

newdata <- combi[qual_cols]
newdata[] <- lapply(combi[qual_cols], function(x) 
         setNames(c(1, 2, 4, 6, 11), grades)[x])
nm1 <- grep("(Cond|Qual)$", names(newdata), value = TRUE)
nm2 <- sub("[A-Z][a-z]+$", "", nm1)
nm3 <- paste0(unique(nm2), 'Grade')
newdata[nm3] <- lapply(split.default(newdata[nm1], nm2), function(x) Reduce(`*`, x))

data

set.seed(24)
combi <- as.data.frame(matrix(sample(grades, 10 * 5, replace = TRUE), 
   ncol = 10, dimnames = list(NULL, qual_cols)), stringsAsFactors = FALSE)
...