我有一個名爲「d」的〜1,300,000行和4列data.frame和另一個data.frame,名爲「gc」,約12,000行和2列(但請看下面的小例子)。如何重寫「sapply」命令以提高性能?
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
我想通過將增加一個第5列,以 「d」來自「gc」的數據與「d」的第一列匹配。目前我正在使用sapply。
d$chr <- sapply(1:nrow(d), function(x) gc[ gc$gene==d[x,1], ]$chr)
但在真實的數據,它需要一個「很長」的時間(我正在用命令「system.time()」以來,超過30分鐘,它仍然沒有完成)。
你有什麼想法我可以用聰明的方式改寫這個嗎?或者我應該考慮使用plyr,也許與「並行」選項(我的電腦上有四個核心)?在這種情況下,最好的語法是什麼?
在此先感謝。
感謝,這正是我需要的。 – tflutre 2011-03-14 20:30:11
+1這太棒了,我不知道這甚至是可能的。 – 2011-03-15 00:46:26
我既不tbh :)但有一個問題。那就是gc [,1]在這裏必須與d [,1]完全相同,每個級別只有一行,每個級別必須是相同的順序。訣竅是,一個因素在數字上對應於1,2 ... – 2011-03-15 07:33:37