加速R中的函数

加速R中的函数,r,R,我在扩展名为.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 我的数据外观的标题如下所示: str(head(

我在扩展名为.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
我的数据外观的
标题如下所示:

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 ...
然后我想将每个列表元素拆分为每个10000的子/元素,为了实现这一点,我使用了以下函数

 chunks = function(x,n) {split(x, ceiling(seq_along(x)/n))}
这基本上将我的列表分成一定数量的块(在本例中为10000)

我的拆分列表的
标题

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)

ll.rand.fis我还没有将这些函数与您的函数进行基准测试,但我最近编写了两个分块函数,将向量列表分成n个或n个片段的组。除了使用Rccp,这些是我能为任务编写的最快的函数。(我针对几种替代实现对它们进行了测试)


分组请提供一个简化的数据示例。如果所有子列表的元素少于100000个,
天花(沿(x)/n)将始终是1的向量。不清楚你到底想做什么。如果你描述一下,也许有人能提出更好的方法。你说的“加速”是什么意思?在您的示例中,大部分时间用于将数据从
mylist
复制到
list.split
。我认为您应该一次处理每个块,只保存结果。嗨@RyanGrannell,当我运行命令
ll.rand=lappy(datos.rand,chop_into,10000)
时,我得到了以下错误:
seq.default中的错误(from=1,to=length(x),by=size):登录“by”参数时出错
如果您试图将10000个元素分组,则需要使用group_into(另一个函数将列表分为10000个元素,而不是10000个元素)。我不确定是什么原因导致了错误,但是试试这个。。。lapply(datos.rand,函数(x)chop_to(x,10000))在RyanGrannell出现同样的错误,无论如何,我将用其他数据集尝试您的函数,并报告您
ll.rand.fis <- lapply(lapply(ll.rand, data.frame), apply, 1, Fisher.test)
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) ]
    })
}