gpt4 book ai didi

r - 无法将 lapply 与 data.table 一起使用

转载 作者:行者123 更新时间:2023-12-02 08:06:26 24 4
gpt4 key购买 nike

我正在尝试在 data.table 中创建所有字符变量的摘要。基本上是为了获得总观察计数、缺失值、频率最高的类别等。但是我无法正确使用 lapply 来实现相同的目的。这是一个可重现的示例。

library(data.table)

#Function to analyze one variable at a time
analyze_char_var <- function(x) {
y = names(x)
z = x[,.N,by=y]
w = setorder(z,-N)

out = data.table(
total_obs = nrow(x),
missing_obs = sum(is.na(x)),
unique_cats = nrow(z),
top_cat = z[1,1],
top_freq = z[1,2]
)
return(out)
}
#Function to analyze all variables. I want to use lapply instead of loop
analyze_all_char <- function(dt) {
dt.char = dt[,sapply(dt,class)=="character", with=FALSE]
mylist = vector('list', length(dt.char))
for (i in 1:length(dt.char)){
x = dt.char[,i,with=FALSE]
mylist[[i]] = analyze_char_var(x)
}
return(mylist)
}

dt = data.table(
var1 = c('a', 'a', 'b','b', 'c'),
var2 = 1:5,
var3 = c('low','low','high','med',NA)
)
dt.analysis = analyze_all_char(dt)

仅使用 dt.analysis = dt.char[,lapply(.SD,analyze_char_var)] 会产生错误 Error in x[, .N, by = y] : incorrect number尺寸。我尝试了一些变体,但无法正常工作。

编辑: 最后这对我有用。但是,看起来很笨拙。将输入向量重新转换为 data.table,然后以 data.frame 方式使用 lapply

test_func <- function(x) {
dt = as.data.table(x)
dt.summ = dt[,.N,by='x'] #by default name is x
# I was stuck in the above line, I was trying all
# sort of bad tricks to get the name of grouping variable


dt.summ.sorted = setorder(dt.summ,-N)
out = data.table(
total_obs = nrow(dt),
missing_obs = sum(is.na(dt)),
unique_cats = nrow(dt.summ.sorted),
top_cat = dt.summ.sorted[1,1],
top_freq = dt.summ.sorted[1,2]
)
return(out)
}

dt.char = dt[,sapply(dt,class)=="character", with=FALSE]
lapply(dt.char,test_func)

最佳答案

I am trying to create a summary of all character variables in a data.table. Basically to get total observation count, missing values, category with highest frequency etc.

由于所有感兴趣的列都具有相同的类型,您可以使用 melt 转到长格式:

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]

# variable NOBS NNA NVALS HIVAL NHI
# 1: var1 5 0 3 a 2
# 2: var3 5 1 4 low 2

要将 NA 排除为一个类别(出现在 NVALS 和可能的 HIVAL、NHI 中),将 [, .N, by="V1"] 更改为 [!is.na( V1), .N, by="V1"] 同上。

我怀疑性能对于这项任务是否重要,但这应该是相当有效的。

关于r - 无法将 lapply 与 data.table 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51022251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com