加速R中的函数
我在扩展名为.tmp2.out的目录中有一个文件列表,我使用以下命令读取这些文件:加速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(
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) ]
})
}