函数 returns lapply 中的函数 - 嵌套 lapply?
Function returns a function within lapply - nested lapply?
在我 运行 遇到 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.
#
# 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 函数。我对如何将它与 returns 函数作为值而不是需要评估的函数一起使用感到困惑。
我最终想创建基于 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
你可以用 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
在我 运行 遇到 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.
#
# 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 函数。我对如何将它与 returns 函数作为值而不是需要评估的函数一起使用感到困惑。
我最终想创建基于 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
你可以用 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