On Monday 17 September 2007, you wrote:
> R 2.6.0 has Reduce;
>
> myvec <- c(2, 8, 24, 26, 51, 57, 58, 78, 219)
> Reduce(function(myvec, p) setdiff(myvec, findSubsets2(p)), myvec, myvec)
Thanks Gabor, at first I jumped off my chair but... for many input variables
it takes <ages> to reduce the vector. My crude solution is way faster than
Reduce()
For 9 input variables:
`findSubsets2` <-
function(element) {
require(QCA)
base3row <- getRow(rep(3,9), element, zerobased=TRUE)
increment <- function(x, y) {
a <- x
for (i in 1:2) {
a <- as.vector(outer(y, a, "+"))
x <- c(x, a)
}
return(x)
}
indices <- which(base3row == 0)
mbase <- c(6561, 2187, 729, 243, 81, 27, 9, 3, 1)
for (i in indices) {
element <- increment(element, mbase[i])
}
return(element[-1])
}
`myreduce` <- function(myvec) {
position <- 1
while(position < length(myvec)) {
falsevector <- findSubsets2(myvec[position])
myvec <- setdiff(myvec, falsevector)
position <- position + 1
}
return(myvec
}
The timings for the tests:
set.seed(1)
myvec1 <- myvec2 <- sort(sample(3^9, 3^8)) - 1
> system.time(myvec1 <- myreduce(myvec1))
user system elapsed
0.200 0.004 0.204
> system.time(myvec2 <- Reduce(function(myvec2, p) setdiff(myvec2,
findSubsets2(p)), myvec2, myvec2))
user system elapsed
12.093 0.000 12.095
With 14 input variables my function takes 24 seconds to complete, and I'd like
to process 20 such input variables (their complexity grow exponentially)...
Thanks again,
Adrian
--
Adrian Dusa
Romanian Social Data Archive
1, Schitu Magureanu Bd
050025 Bucharest sector 5
Romania
Tel./Fax: +40 21 3126618 \
+40 21 3120210 / int.101
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.