看板 R_Language 關於我們 聯絡資訊
請參見, 懶得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]) } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.4.209 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1447846663.A.E01.html ※ 編輯: Edster (140.112.4.209), 11/18/2015 19:53:06
Edster: 寫完之後才覺得, 最近好像版上有人問過類似的事. 11/18 21:48
※ 編輯: Edster (1.164.10.151), 11/18/2015 21:52:23
celestialgod: 改寫成RcppParallel http://pastebin.com/DQ6eczx2 11/19 00:10
celestialgod: 比我原先的版本快不少XD 11/19 00:12
celestialgod: 後來發現寫錯,暫時移除xd 11/19 00:33
celestialgod: 改好了,不過只適用於數字連續的時候 11/19 00:38
Edster: C版真是一行文的代表,很喜歡你的method 1. 11/19 00:38
Edster: 不過好像要一直重新指定記憶體在 dat %in% dat[i,] 11/19 00:39
celestialgod: 可是很慢啊Orz 11/19 00:39
Edster: 然後還要reshape, 但把 sum 用在 TRUE/FALSE 上是我想都沒 11/19 00:40
Edster: 想過的做法, 學習了. 11/19 00:40
celestialgod: E大做表格的方法也很amazing 11/19 00:41
celestialgod: 很實用,當說很擔心表格會爆XD 11/19 00:41
celestialgod: 想 11/19 00:41
celestialgod: 我覺得比較快的方法應該是做表格然後factor取整數 11/19 00:42
celestialgod: 這樣就不用用到names了 11/19 00:42
celestialgod: 不過就留給原po自己玩吧 11/19 00:42
Edster: 看了C版改的method 4, 突然覺得我多寫了很多不必要的設定. 11/19 01:03
Edster: 然後版大的dat應該是已經factorize後的factor吧. 11/19 01:06
Edster: 這個原po請要注意, 不然dat內的值跳號就out of boundary了 11/19 01:07
celestialgod: 我是只有1~100 而且樣本數夠大 11/19 01:14
celestialgod: 所以基本上沒跳號XD 11/19 01:14
celestialgod: 原po要先factor就是 11/19 01:14
Udyr: 感謝大家,昨天用C大的方法真的有快多了! 11/19 09:08