Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何处理包含3000万条目的大型文件?_R_Large Files_Outliers_Large Data - Fatal编程技术网

R 如何处理包含3000万条目的大型文件?

R 如何处理包含3000万条目的大型文件?,r,large-files,outliers,large-data,R,Large Files,Outliers,Large Data,我问题的第一部分是,有没有比标准差更快的计算方法 mySD = apply(myData,1,sd) 问题的第二部分是如何去除异常值(每行平均值的3 SD)并重新计算每行的SD 问题的第三部分是,一旦我计算出每一行的SD,如何选取超过某个阈值的行(例如0.05) 我的矩阵有3000万roaw和50列 如果有比R更快的方法(例如perl或matlab),我也很乐意尝试 我有一个3000万行50列的矩阵。对于每一行,我想删除异常值并计算标准偏差(SD)。因此,我将有3000万SD。 然后我想选择

我问题的第一部分是,有没有比标准差更快的计算方法

mySD = apply(myData,1,sd)
问题的第二部分是如何去除异常值(每行平均值的3 SD)并重新计算每行的SD

问题的第三部分是,一旦我计算出每一行的SD,如何选取超过某个阈值的行(例如0.05)

我的矩阵有3000万roaw和50列

如果有比R更快的方法(例如perl或matlab),我也很乐意尝试

我有一个3000万行50列的矩阵。对于每一行,我想删除异常值并计算标准偏差(SD)。因此,我将有3000万SD。 然后我想选择SD最高的行(前%5)

我尝试了R,但即使将数据加载到R中也要花费大量时间。我甚至将数据保存为*RData。但仍然要缓慢和太多的时间

有没有更快的方法来做这些事情?在r、perl或matlab中

library(bigmemory)
?read.big.matrix

首先。然后看一下
biganalytics
bigtablate
biglm
,等等。

你的问题有两个部分,高效计算和处理大数据

有效计算 假设您有一个更易于管理的数据集
m
,其中包含5%的3000万行和50列(这大约占我8Gb的30%;内存不足会使所有内容运行缓慢,因此您需要让我们了解这类信息)

对于矩阵
m
而言,
rowSD(m)
的原始实现大约需要56秒,而@BenBolker的更新大约需要1.4秒<代码>清洁(sd)大约需要5秒。两者都制作了数据的多个副本并传递数据,这远远不够理想

大数据 考虑以大小为
nrow
的块处理数据。如果清理了两个块
m1
m2
,则可以将它们组合起来,并使用

sd <- c(rowSD(m1), rowSD(m2))
## if sorted, sd[idx] would be the value that separate high and low
idx <- nrow(result) + nrow(m) - nrow 
keep <- sd > sort.int(sd, partial=idx)[idx]  # index correct, or off-by-one?
## replace smallest in m1 with largest in m2
m1[!head(keep, nrow(m1)),] <- m2[tail(keep, nrow(m2)),]

结果
是所需的具有最高标准偏差的已清理行的集合。

当我们不知道您的方法是什么或它有多快时,“更快的方法”没有多大意义…@flodel在这种情况下,离群值将与每行的平均值相差3SD。发件人:
sdbyrow@MartinMorgan非常感谢,我现在正在尝试。我会试试这个,让你知道它是怎么回事。@MartinMorgan,第一列是文本,它是标题。如何更改扫描(),使其成为标题?您可以在
scan()
中使用
skip=1
(这似乎与您的问题没有直接关系???)@BenBolker我正在尝试按行计算,每行都有标题(第一列是标题)。MartinMorgan建议使用scan()更快地加载文件。但是scan()不喜欢我有标题。
rowSD <- function(m) {
    ## efficiently calculate row-wise SD
    ## naive: apply(m, 1, sd, na.rm=TRUE)
    ## update via @BenBolker / http://stackoverflow.com/questions/16046820/change-row-values-to-zero-if-less-than-row-standard-deviation
    sqrt(rowSums((m - rowMeans(m, na.rm=TRUE))^2, na.rm=TRUE) / (ncol(m)-1))
}

clean <- function(m) {
    ## efficiently implement your strategy for identifying outliers
    m[abs(m - rowMeans(m)) > 3 * rowSD(m)] <- NA  # fast enough
    m
}
sd <- c(rowSD(m1), rowSD(m2))
## if sorted, sd[idx] would be the value that separate high and low
idx <- nrow(result) + nrow(m) - nrow 
keep <- sd > sort.int(sd, partial=idx)[idx]  # index correct, or off-by-one?
## replace smallest in m1 with largest in m2
m1[!head(keep, nrow(m1)),] <- m2[tail(keep, nrow(m2)),]
conn <- file("myfile", "r")
result <- matrix(0, nrow, ncol)
while (length(x <- scan(con, nmax = nrow * ncol))) {
    m <- clean(matrix(x, nrow, ncol, byrow=TRUE))
    sd <- c(rowSD(result), rowSD(m))
    idx <- nrow(result) + nrow(m) - nrow
    keep <- sd > sort.int(sd, partial=idx)[idx]
    result[!head(keep, nrow),] <- m[tail(keep, nrow(m)),]
}
close(conn)