【问题标题】:Function returns a function within lapply - nested lapply?函数在 lapply 中返回一个函数 - 嵌套 lapply?
【发布时间】:2018-08-09 00:16:20
【问题描述】:

在遇到 lapply 函数的问题之前,我认为我的代码很优雅。 我使用 dput 输出样本。请注意,我使用的是 data.table 而不是 data.frame。

full_data <- structure(list(FireplaceQu = c("Gd", "Gd", "TA", "TA", "Gd", 
"None", "Gd", "Gd", "None", "None", "None", "None", "Gd", "Gd", 
"Gd", "None"), BsmtQual = c("TA", "Gd", "Gd", "TA", "Gd", "TA", 
"Ex", "TA", "TA", "TA", "TA", "Ex", "TA", "Ex", "Ex", "Gd"), 
    CentralAir = c("Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", 
    "N", "Y", "Y", "Y", "Y", "Y", "Y")), .Names = c("FireplaceQu", 
"BsmtQual", "CentralAir"), class = "data.frame", row.names = c(NA, 
-16L))

library(data.table)
setDT(full_data)


cols = c('FireplaceQu', 'BsmtQual', 'CentralAir')

FireplaceQu=c('None','Po','Fa','TA','Gd','Ex')
BsmtQual=c('None','Po','Fa','TA','Gd','Ex')
CentralAir=NA

cust_levels <- list(FireplaceQu, BsmtQual, CentralAir)

# I modified a function from SO to sort based on set levels instead of by using default sort function.
# https://stackoverflow.com/questions/38620424/label-encoder-functionality-in-r
# function which returns function which will encode vectors with values  of 'vec' 
lev_index = 1
label_encoder = function(vec){
    levels = cust_levels[[lev_index]]
    lev_index = lev_index + 1
    function(x){
        match(x, levels)
    }
}

full_data[, (cols) := lapply(.SD, lapply(.SD, label_encoder)), .SDcols = cols]

我知道我可以让它在 for 循环中工作,但我想我会尝试使用 lapply 函数。我很困惑如何将它与返回一个函数作为值并且需要评估的函数一起使用。

我最终想创建基于 cust_levels 顺序的整数值。如果我能摆脱 lev_index,那就有好处了!

示例输入:

FireplaceQu BsmtQual CentralAir
         None       Gd          Y
           TA       Gd          Y
           TA       Gd          Y
           Gd       TA          Y

示例输出:

FireplaceQu BsmtQual CentralAir
         1       5          NA
         4       5          NA
         4       5          NA
         5       4          NA

【问题讨论】:

  • 那么您能否为此输入提供所需的输出,以便测试和验证可能的解决方案?

标签: r function data.table lapply factors


【解决方案1】:

您可以使用mapply

full_data[, (cols) := mapply(match, .SD, cust_levels, SIMPLIFY = FALSE), .SDcols = cols]

# > full_data
#     FireplaceQu BsmtQual CentralAir
#  1:           5        4         NA
#  2:           5        5         NA
#  3:           4        5         NA
#  4:           4        4         NA
#  5:           5        5         NA
#  6:           1        4         NA
#  7:           5        6         NA
#  8:           5        4         NA
#  9:           1        4         NA
# 10:           1        4         NA
# 11:           1        4         NA
# 12:           1        6         NA
# 13:           5        4         NA
# 14:           5        6         NA
# 15:           5        6         NA
# 16:           1        5         NA

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 2020-07-01
    • 2019-11-27
    • 2015-07-15
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多