Это должно сделать это:
analyze_all_char <- function(dt) {
dt.char = dt[,sapply(dt,class)=="character", with=FALSE]
mylist = lapply(1:length(dt.char), function(i) {
x = dt.char[,i,with=FALSE]
analyze_char_var(x)
})
return(mylist)
}
Бенчмаркинг это, вы не увидите слишком большого прироста производительности. Если вы после выступления, я бы посоветовал выполнить вычисления с data.table
операциями.
Я увеличил data.frame и проверил решение for-loop, lapply и @ Frank. Чистый победитель - data.table
!
Unit: milliseconds
expr min lq mean median uq max neval cld
forloop 4.070700 4.685024 7.220436 6.709425 8.564480 35.81166 500 b
lapply 3.988765 4.750347 7.367764 6.815147 8.613754 56.58692 500 b
lapply1 4.008022 4.728257 7.390874 6.786074 8.551453 51.31551 500 b
dtf 2.984400 3.320825 5.451909 4.699372 6.661660 40.85501 500 a
Полный код:
dt = data.table(
var1 = rep(c('a', 'a', 'b','b', 'c'),100),
var2 = rep(1:5,100),
var3 = rep(c('low','low','high','med',NA),100)
)
analyze_all_char <- function(dt) {
dt.char = dt[,sapply(dt,class)=="character", with=FALSE]
mylist = list()
for (i in 1:length(dt.char)){
x = dt.char[,i,with=FALSE]
mylist[[i]] = analyze_char_var(x)
}
return(mylist)
}
analyze_all_char_l <- function(dt) {
dt.char = dt[,sapply(dt,class)=="character", with=FALSE]
mylist = lapply(1:length(dt.char), function(i) {
x = dt.char[,i,with=FALSE]
analyze_char_var(x)
})
return(mylist)
}
analyze_all_char_l1 <- function(dt) {
dt.char = dt[,sapply(dt,class)=="character", with=FALSE]
mylist = lapply(1:length(dt.char), function(i) {
analyze_char_var(dt.char[,i,with=FALSE])
})
return(mylist)
}
dtf <- function() {
melt(dt.char <- Filter(is.character, dt), meas=names(dt.char))[, {
tabula = setDT(list(value))[, .N, by="V1"][order(-N, V1)]
.(
NOBS = .N,
NNA = sum(is.na(value)),
NVALS = nrow(tabula),
HIVAL = tabula$V1[1L],
NHI = tabula$N[1L]
)
}, by=variable]
}
analyze_all_char(dt)
analyze_all_char_l(dt)
analyze_all_char_l1(dt)
dtf()
library(microbenchmark)
mc <- microbenchmark(times=500,
forloop = analyze_all_char(dt),
lapply = analyze_all_char_l(dt),
lapply1 = analyze_all_char_l1(dt),
dtf = dtf()
)
mc