我以为我在处理代码时很优雅,直到遇到了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发布于 2018-08-09 01:17:26
你可以用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 NAhttps://stackoverflow.com/questions/51757262
复制相似问题