Re: [問題] list比對

作者: Edster (Edster)   2015-11-18 19:37:40
請參見, 懶得generate data. 應該不會太慢. 至少不用一個個比對.
library(magrittr)
X=list()
X[[1]]= "1,2,3,4,5,6,7,8,9,19"
X[[2]]= "1,3,4,6,8,9,10,15,17,18"
X[[3]]= "4,5,7,11,20,24,25,27,28,29,39"
X = lapply(X, function(x){as.integer(strsplit(x, ",")[[1]])});
Y = unlist(X) %>% unique %>% sort
Z = matrix(NA, nrow=length(X), ncol=max(Y), dimnames=list(1:length(X),
1:max(Y)))
Count=numeric(length(X))
for(i in 1:length(X))
for(j in 1:10)
Z[i,X[[i]][j]] = 1
for(i in 1:length(X)){
p = Z[, names(na.omit(Z[i,]))] %>% rowSums(., na.rm=T)
Count[i] = length(p[p>5])
}
作者: Edster (Edster)   2015-11-18 21:48:00
寫完之後才覺得, 最近好像版上有人問過類似的事.
作者: celestialgod (天)   2015-11-19 00:10:00
改寫成RcppParallel http://pastebin.com/DQ6eczx2比我原先的版本快不少XD後來發現寫錯,暫時移除xd改好了,不過只適用於數字連續的時候
作者: Edster (Edster)   2015-11-19 00:38:00
C版真是一行文的代表,很喜歡你的method 1.不過好像要一直重新指定記憶體在 dat %in% dat[i,]
作者: celestialgod (天)   2015-11-19 00:39:00
可是很慢啊Orz
作者: Edster (Edster)   2015-11-19 00:40:00
然後還要reshape, 但把 sum 用在 TRUE/FALSE 上是我想都沒想過的做法, 學習了.
作者: celestialgod (天)   2015-11-19 00:41:00
E大做表格的方法也很amazing很實用,當說很擔心表格會爆XD想我覺得比較快的方法應該是做表格然後factor取整數這樣就不用用到names了不過就留給原po自己玩吧
作者: Edster (Edster)   2015-11-19 01:03:00
看了C版改的method 4, 突然覺得我多寫了很多不必要的設定.然後版大的dat應該是已經factorize後的factor吧.這個原po請要注意, 不然dat內的值跳號就out of boundary了
作者: celestialgod (天)   2015-11-19 01:14:00
我是只有1~100 而且樣本數夠大所以基本上沒跳號XD原po要先factor就是
作者: Udyr (Udyr)   2015-11-19 09:08:00
感謝大家,昨天用C大的方法真的有快多了!

Links booklink

Contact Us: admin [ a t ] ucptt.com