【问题标题】:How to use apply to create multiple polynomial variables?如何使用 apply 创建多个多项式变量?
【发布时间】:2018-12-01 17:50:52
【问题描述】:

我有几个变量,

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)

【问题讨论】:

  • 请展示一个可重现的小例子和预期的输出
  • 嗨 @akrun 更新了,让我知道它是否可以使用任何进一步的说明
  • 有疑问,"BsmtCond" "HeatingQC" 这些列如何乘以 qual_cols 中的某些名称没有相应的“Qual/Cond”列
  • 这些乘以已经是数字的列
  • 请检查您的qual_cols。我没有找到某些列乘法的模式。无论如何,根据您提供的信息,我发布了一个解决方案

标签: r polynomial-math feature-engineering


【解决方案1】:

我们可以使用命名向量将值更改为数字

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))

数据

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

【讨论】:

    【解决方案2】:

    如果变量名不一致(即不仅仅是 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)
    

    房屋总完工面积(包括地下室)

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

    门廊总面积

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

    组合添加

    combi$Additions <- combi$YearRemodAdd + as.numeric(combi$GarageYrBlt)
    

    【讨论】:

      猜你喜欢
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 2018-07-31
      相关资源
      最近更新 更多