gpt4 book ai didi

performance - 如何重写 "sapply"命令以提高性能?

转载 作者:行者123 更新时间:2023-12-04 16:55:55 26 4
gpt4 key购买 nike

我有一个名为“d”的 ~1,300,000 行和 4 列的 data.frame 和另一个名为“gc”的 ~12,000 行和 2 列的 data.frame(但请参阅下面的较小示例)。

d <- data.frame( gene=rep(c("a","b","c"),4), val=rnorm(12), ind=c( rep(rep("i1",3),2), rep(rep("i2",3),2) ), exp=c( rep("e1",3), rep("e2",3), rep("e1",3), rep("e2",3) ) )
gc <- data.frame( gene=c("a","b","c"), chr=c("c1","c2","c3") )

这是“d”的样子:
   gene         val ind exp
1 a 1.38711902 i1 e1
2 b -0.25578496 i1 e1
3 c 0.49331256 i1 e1
4 a -1.38015272 i1 e2
5 b 1.46779219 i1 e2
6 c -0.84946320 i1 e2
7 a 0.01188061 i2 e1
8 b -0.13225808 i2 e1
9 c 0.16508404 i2 e1
10 a 0.70949804 i2 e2
11 b -0.64950167 i2 e2
12 c 0.12472479 i2 e2

这是“gc”:
  gene chr
1 a c1
2 b c2
3 c c3

我想通过合并来自“gc”的与“d”的第一列匹配的数据来向“d”添加第 5 列。目前我正在使用 树胶 .
d$chr <- sapply( 1:nrow(d), function(x) gc[ gc$gene==d[x,1], ]$chr )

但在真实数据上,它需要“很长”的时间(我用“system.time()”运行命令超过 30 分钟,但仍未完成)。

你知道我如何以聪明的方式重写它吗?或者我应该考虑使用 胶合板 ,也许使用“并行”选项(我的计算机上有四个内核)?在这种情况下,最好的语法是什么?

提前致谢。

最佳答案

我认为您可以将该因子用作索引:

gc[ d[,1], 2]
[1] c1 c2 c3 c1 c2 c3 c1 c2 c3 c1 c2 c3
Levels: c1 c2 c3

与以下相同:
 sapply( 1:nrow(d), function(x) gc[ gc$gene==d[x,1], ]$chr )
[1] c1 c2 c3 c1 c2 c3 c1 c2 c3 c1 c2 c3
Levels: c1 c2 c3

但要快得多:
> system.time(replicate(1000,sapply( 1:nrow(d), function(x) gc[ gc$gene==d[x,1], ]$chr )))
user system elapsed
5.03 0.00 5.02
>
> system.time(replicate(1000,gc[ d[,1], 2]))
user system elapsed
0.12 0.00 0.13

编辑:

稍微扩展一下我的评论。 gc数据框需要每一级 gene 一行按照这个工作的级别顺序:
 d <- data.frame( gene=rep(c("a","b","c"),4), val=rnorm(12), ind=c( rep(rep("i1",3),2), rep(rep("i2",3),2) ), exp=c( rep("e1",3), rep("e2",3), rep("e1",3), rep("e2",3) ) )
gc <- data.frame( gene=c("c","a","b"), chr=c("c1","c2","c3") )

gc[ d[,1], 2]
[1] c1 c2 c3 c1 c2 c3 c1 c2 c3 c1 c2 c3
Levels: c1 c2 c3

sapply( 1:nrow(d), function(x) gc[ gc$gene==d[x,1], ]$chr )
[1] c2 c3 c1 c2 c3 c1 c2 c3 c1 c2 c3 c1
Levels: c1 c2 c3

但解决这个问题并不难:
levels(gc$gene) <- levels(d$gene) # Seems redundant as this is done right quite often automatically
gc <- gc[order(gc$gene),]


gc[ d[,1], 2]
[1] c2 c3 c1 c2 c3 c1 c2 c3 c1 c2 c3 c1
Levels: c1 c2 c3

sapply( 1:nrow(d), function(x) gc[ gc$gene==d[x,1], ]$chr )
[1] c2 c3 c1 c2 c3 c1 c2 c3 c1 c2 c3 c1
Levels: c1 c2 c3

关于performance - 如何重写 "sapply"命令以提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5303807/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com