首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数返回lapply嵌套lapply中的函数?

函数返回lapply嵌套lapply中的函数?
EN

Stack Overflow用户
提问于 2018-08-09 00:16:20
回答 1查看 78关注 0票数 1

我以为我在处理代码时很优雅,直到遇到了lapply函数的问题。我用dput输出样本。请注意,我使用的是data.table而不是data.frame。

代码语言:javascript
复制
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!

示例输入:

代码语言:javascript
复制
FireplaceQu BsmtQual CentralAir
         None       Gd          Y
           TA       Gd          Y
           TA       Gd          Y
           Gd       TA          Y

示例输出:

代码语言:javascript
复制
FireplaceQu BsmtQual CentralAir
         1       5          NA
         4       5          NA
         4       5          NA
         5       4          NA
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-09 01:17:26

你可以用mapply来做这件事

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51757262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档