gpt4 book ai didi

r - 使用数据表删除仅包含 NA 的列

转载 作者:行者123 更新时间:2023-12-05 01:16:56 24 4
gpt4 key购买 nike

有没有比

更好的办法
DT <- DT[,!apply(DT,2,function(x) all(is.na(x))), with = FALSE]

仅在未完全填充 NA 的列上使用数据表进行子集化?

谢谢

最佳答案

基本思想是找到所有-NA 列,类似:

na_idx = sapply(DT, function(x) all(is.na(x)))

要将此应用于对表格进行子集化,答案取决于您是要从表格中删除这些列,还是打算创建一个单独的派生表格;

在前一种情况下,您应该将这些列设置为 NULL:

DT[ , which(sapply(DT, function(x) all(is.na(x)))) := NULL]

在后一种情况下,有几种选择:

idx = sapply(DT, function(x) !all(is.na(x)))
DT = DT[ , idx, with = FALSE] # or DT = DT[ , ..idx]

DT = DT[ , lapply(.SD, function(x) if (all(is.na(x))) NULL else x)]

applycolSums 方法将涉及可能效率低下的矩阵转换。

这是此处和@DavidArenburg 在上面的评论中列出的案例的基准:

          method   time
1: which := NULL 1.434
2: for set NULL 3.432
3: lapply(.SD) 16.041
4: ..idx 10.343
5: with FALSE 4.896

代码:

library(data.table)

NN = 1e7
kk = 50
n_na = 5

set.seed(021349)
DT = setDT(replicate(kk, rnorm(NN), simplify = FALSE))
DT[ , (sample(kk, n_na)) := NA_real_]

DT2 = copy(DT)

t1 = system.time(
DT2[ , which(sapply(DT2, function(x) all(is.na(x)))) := NULL]
)

rm(DT2)
DT2 = copy(DT)

t2 = system.time({
for (col in copy(names(DT2)))
if (all(is.na(DT2[[col]]))) set(DT2, , col, NULL)
})

rm(DT2)
DT2 = copy(DT)

t3 = system.time({
DT3 = DT2[ , lapply(.SD, function(x) if (all(is.na(x))) NULL else x)]
})

rm(DT3)

t4 = system.time({
idx = sapply(DT2, function(x) !all(is.na(x)))
DT3 = DT2[ , ..idx]
})

rm(DT3)

t5 = system.time({
idx = sapply(DT2, function(x) !all(is.na(x)))
DT3 = DT2[ , idx, with = FALSE]
})

data.table(
method = c('which := NULL', 'for set NULL',
'lapply(.SD)', '..idx', 'with FALSE'),
time = sapply(list(t1, t2, t3, t4, t5), `[`, 'elapsed')
)

关于r - 使用数据表删除仅包含 NA 的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52178587/

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