用大数据估算列的最快方法

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] 设置为第一列的子集。 哇,这真是个糟糕的选项名称。我确切地知道它的作用。

以上是关于用大数据估算列的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

最简单的大数据性能估算方法

数据挖掘:用大数据的刀切小数据的蛋糕

UC打通高德POI数据,用大数据描绘周边热点地图

用大数据思维做运维监控

“中琛魔方”首次亮相:中琛源如何助企业用大数据挖掘大价值

从多个文件中读取大数据并在python中聚合数据的最快方法是啥?