用大数据估算列的最快方法
Posted
技术标签:
【中文标题】用大数据估算列的最快方法【英文标题】:Fastest way to impute column means with large data 【发布时间】:2017-03-31 01:26:13 【问题描述】:我有一个大型数字数据集(约 700 行,350,000 列,作为 R 中的 data.table 读入),其中包含一些我想尽快用列方法替换的 NA。我发现以前的帖子将 NA 替换为 0,但是当我修改解决方案以代替输入列表示时,我得到 j,即列号。看来我一定遗漏了一些明显的东西......关于如何使用这种方法计算列均值的任何建议?
Fastest way to replace NAs in a large data.table
#original code
f_dowle3 = function(DT)
for(j in seq_len(ncol((DT)))
set(DT,which(is.na(DT[[j]])),j,0)
#modified code
impute = function(DT)
for(j in 2:ncol(DT))
set(DT,which(is.na(DT[[j]])),j,mean(DT[,j],na.rm = TRUE))
test_impute = fread("test_impute.csv")
test_impute
ID snp1 snp2 snp3 snp4
1: 1 2 1 1 0
2: 2 2 2 0 0
3: 3 2 NA 0 NA
4: 4 2 1 2 0
5: 5 2 NA 2 0
6: 6 2 1 1 0
7: 7 1 1 NA 0
8: 8 NA 1 0 0
9: 9 2 2 2 NA
10: 10 1 1 0 0
impute(test_impute)
test_impute
ID snp1 snp2 snp3 snp4
1: 1 2 1 1 0
2: 2 2 2 0 0
3: 3 2 3 0 5
4: 4 2 1 2 0
5: 5 2 3 2 0
6: 6 2 1 1 0
7: 7 1 1 4 0
8: 8 2 1 0 0
9: 9 2 2 2 5
10: 10 1 1 0 0
【问题讨论】:
【参考方案1】:如果不想创建自己的函数,也可以使用其他插补包。
例如imputeTS:
library(imputeTS)
solution <- na.mean(yourDataframe)
mice 等其他软件包也有类似的选项。
猜你必须测试,哪一个最快。 可能是Gregors最后的解决方案已经是最快的了。
【讨论】:
【参考方案2】:您不能使用dt1[, j]
从数据表中获取列。
dt1[, 1]
# [1] 1
dt1[, 2342]
# [1] 2342
将DT[, j]
更改为DT[[j]]
进行修复。
首先是一些数据:
set.seed(47)
n = 10
ncol = 10
dt1 = data.table(replicate(ncol, expr =
ifelse(runif(n) < 0.2, NA_real_, rpois(n, 10))
))
impute1 = function(DT)
for (j in 2:ncol(DT))
set(DT, which(is.na(DT[[j]])), j, mean(DT[[j]], na.rm = TRUE))
dt1
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1: 6 11 10 7 13 10 12 8 13 12
# 2: 10 8 NA 7 16 10 10 8 5 5
# 3: 14 7 9 9 NA 13 9 NA 10 NA
# 4: 4 4 13 10 7 10 14 8 13 15
# 5: 7 NA 8 NA 12 NA 15 10 11 8
# 6: 6 9 7 15 NA 5 12 15 10 5
# 7: 4 9 5 NA 10 12 9 8 12 14
# 8: 12 8 NA 9 7 NA 11 4 8 11
# 9: 8 10 12 14 10 NA 11 9 10 10
# 10: 7 6 NA 13 8 14 11 6 10 NA
impute1(dt1)
dt1
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1: 6 11 10.000000 7.0 13.000 10.00000 12 8.000000 13 12
# 2: 10 8 9.142857 7.0 16.000 10.00000 10 8.000000 5 5
# 3: 14 7 9.000000 9.0 10.375 13.00000 9 8.444444 10 10
# 4: 4 4 13.000000 10.0 7.000 10.00000 14 8.000000 13 15
# 5: 7 8 8.000000 10.5 12.000 10.57143 15 10.000000 11 8
# 6: 6 9 7.000000 15.0 10.375 5.00000 12 15.000000 10 5
# 7: 4 9 5.000000 10.5 10.000 12.00000 9 8.000000 12 14
# 8: 12 8 9.142857 9.0 7.000 10.57143 11 4.000000 8 11
# 9: 8 10 12.000000 14.0 10.000 10.57143 11 9.000000 10 10
# 10: 7 6 9.142857 13.0 8.000 14.00000 11 6.000000 10 10
另一种选择是预先计算列均值。 colMeans
非常快,因此总体上可能会更快,尤其是在您拥有尽可能多的列的情况下。
impute2 = function(DT)
means = colMeans(DT, na.rm = T)
for (j in 2:ncol(DT))
set(DT, which(is.na(DT[[j]])), j, means[j])
【讨论】:
非常感谢!!这解决了它,这两种方法都有效!我会使用后者,因为它可能是一个更快的选择。 供您参考答案的第一部分,在切换选项后的开发中,可以更改该行为。请参阅 1.9.7 新闻中的第 3 项:github.com/Rdatatable/data.table/blob/master/NEWS.md 所以我可以将options(datatable.WhenJisSymbolThenCallingScope=TRUE); dt[, 1]
设置为第一列的子集。
哇,这真是个糟糕的选项名称。我确切地知道它的作用。以上是关于用大数据估算列的最快方法的主要内容,如果未能解决你的问题,请参考以下文章