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