2

我在扩展名为.tmp2.out的目录中有一个文件列表,我使用以下方法读取这些文件:

 files.rand = list.files(getwd(), pattern="*.tmp2.out");
 data.rand = lapply(files.rand, scan);
 names.rand = gsub(pattern=".tmp2.out", "", files.rand)
 names(data.rand) = names.rand

head我的数据的外观如下:

str(head(datos.rand))
 List of 6
 $ A1CF : num [1:50000] 0.812 0.1 0.764 0.894 0.495 ...
 $ A2LD1: num [1:20000] 0.797 0.282 0.9 0.276 0.339 ...
 $ AASDH: num [1:50000] 0.359 0.22 0.246 0.717 0.454 ...
 $ ABCA6: num [1:40000] 0.571 0.182 0.349 0.623 0.661 ...
 $ ABCB1: num [1:40000] 0.58 0.667 0.322 0.42 0.156 ...
 $ ABCC1: num [1:60000] 0.161 0.12 0.321 0.672 0.571 ...

然后我想将每个列表元素拆分为 10,000 个子/元素,为此我使用了以下功能

 chunks = function(x,n) {split(x, ceiling(seq_along(x)/n))}

这基本上将我的列表分成一定数量的块(在示例中为 10,000)。

list.split = lapply(mylist, chunks, 10000)

我的head拆分列表看起来如何

str(head(ll.rand))
List of 6
 $ A1CF  :List of 5
  ..$ 1 : num [1:10000] 0.571 0.182 0.349 0.623 0.661 ...
  ..$ 2 : num [1:10000] 0.0155 0.3622 0.4234 0.1101 0.5237 ...
  ..$ 3 : num [1:10000] 0.459 0.458 0.306 0.914 0.124 ...
  ..$ 4 : num [1:10000] 0.448 0.679 0.244 0.671 0.132 ...
  ..$ 5 : num [1:10000] 0.798 0.722 0.411 0.451 0.717 ...
 $ A2LD1  :List of 2
  ..$ 1: num [1:10000] 0.904 0.42 0.602 0.412 0.689 ...
  ..$ 2: num [1:10000] 0.336 0.656 0.521 0.485 0.409 ...
 $ AASDH  :List of 5
  ..$ 1: num [1:10000] 0.0875 0.9899 0.1029 0.016 0.5908 ...
  ..$ 2: num [1:10000] 0.162 0.534 0.424 0.116 0.57 ...
  ..$ 3: num [1:10000] 0.2823 0.5986 0.0657 0.4611 0.456 ...
  ..$ 4: num [1:10000] 0.0213 0.0449 0.0451 0.4611 0.3269 ...
  ..$ 5: num [1:10000] 0.489 0.913 0.22 0.156 0.621 ...
 $ ABCA6  :List of 4
  ..$ 1: num [1:10000] 0.8346 0.0782 0.4264 0.3873 0.6083 ...
  ..$ 2: num [1:10000] 0.0817 0.6402 0.7748 0.7125 0.4967 ...
  ..$ 3: num [1:10000] 0.793 0.316 0.182 0.753 0.563 ...
  ..$ 4: num [1:10000] 0.52 0.483 0.597 0.792 0.516 ...
 $ ABCB1  :List of 4
  ..$ 1: num [1:10000] 0.8607 0.2928 0.2203 0.0141 0.6871 ...
  ..$ 2: num [1:10000] 0.168 0.5665 0.0958 0.7202 0.4807 ...
  ..$ 3: num [1:10000] 0.939 0.743 0.295 0.404 0.79 ...
  ..$ 4: num [1:10000] 0.0255 0.1296 0.4843 0.5932 0.6778 ...
 $ ABCC1   :List of 6
  ..$ 1 : num [1:10000] 0.67152 0.94983 0.90776 0.7092 0.00133 ...
  ..$ 2 : num [1:10000] 0.755 0.893 0.789 0.172 0.163 ...
  ..$ 3 : num [1:10000] 0.724 0.375 0.897 0.493 0.731 ...
  ..$ 4 : num [1:10000] 0.758 0.576 0.499 0.508 0.642 ...
  ..$ 5 : num [1:10000] 0.1936 0.0927 0.0889 0.4293 0.3606 ...
  ..$ 6 : num [1:10000] 0.387 0.612 0.29 0.608 0.422 ...

下一步将对每个子列表的第一个子/元素应用一个函数(Fisher.test),然后应用到第二个,依此类推,我使用的代码是:

ll.rand.fis <- lapply(lapply(ll.rand, data.frame), apply, 1, Fisher.test)

我的问题是,将数据分成块的步骤很慢并且需要大量内存,有什么想法可以加快这个过程吗?

提前谢谢了。

4

1 回答 1

0

我没有针对你的函数对这些函数进行基准测试,但我最近编写了两个分块函数来将向量列表划分为 n 个或 n 个部分的组。除了使用 Rccp 之外,这些是我可以为该任务编写的最快的函数。(我针对几种替代实现对它们进行了测试)。

group_into <- function (x, size) {
# groups x into chucks of size,
# unless too few elements are left

size <- abs(size)
if (size == length(x)) {
    list(x)
} else if (size == 0) {
    list()
} else {    
    lapply(
        seq(from = 1, to = length(x), by = size),
        function (lower) {
            x[ lower:min(length(x), lower + size - 1) ]
    })
}
}

chop_into <- function (x, pieces) {
# chop a vector x into pieces...pieces,
# if it's possible

pieces <- abs(pieces)

if (pieces > length(x)) return (group_into(x, 1))

average_size <- ceiling(length(x) / pieces)

lapply(
        seq(from = 1, to = length(x), length.out = pieces),
        function (lower) {
        x[ lower:min(length(x), lower + average_size) ]
    })
}

就内存使用而言,这些函数仍然很糟糕,因为大多数 R 对象在修改时都会被深度复制。这是很难避免的。

这些函数经过单元测试,以确保极端情况不奇怪,尽管我不知道它们对您的应用程序的效果如何。如果您有任何加速,请告诉我:)

于 2013-06-18T18:55:44.260 回答