Dear list, I have a vector of numbers, let's say:
myvec <- c(2, 8, 24, 26, 51, 57, 58, 78, 219) My task is to reduce this vector to non-reducible numbers; small numbers can cross-out some of the larger ones, based on a function let's say called reduce() If I apply the function to the first element 2, my vector gets shorted to: > (myvec <- reduce(myvec[1])) [1] 2 24 51 57 58 78 219 The next element that can further reduce the vector is the second (24) and a next iteration further reduces it and so on, until nothing can be reduced. The question is, what is the best programming technique to achieve this? My crude solution is: #### position <- 1 # start with the first position in the vector (smallest number) while(position < length(myvec)) { myvec <- reduce(myvec[position]) position <- position + 1 } #### Is there a better programming approach? Some vectors have lengths of millions, so this one takes a very long time. Thanks in advance, Adrian PS: below is a self-contained example: The initial vector corresponds to the following lines in a base 3 matrix: [,1] [,2] [,3] [,4] [,5] 2 0 0 0 0 2 8 0 0 0 2 2 24 0 0 2 2 0 26 0 0 2 2 2 51 0 1 2 2 0 57 0 2 0 1 0 58 0 2 0 1 1 78 0 2 2 2 0 219 2 2 0 1 0 In the first iteration, the first element 2 eliminates 8 and 26 because both contain number 2 in the last position (first line being shorter). The element 24 eliminates 51 and 78, and so on. `findSubsets2` <- function(element) { require(QCA) base3row <- getRow(rep(3,5), 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(81, 27, 9, 3, 1) for (i in indices) { element <- increment(element, mbase[i]) } return(element[-1]) } position <- 1 while(position < length(myvec)) { falsevector <- findSubsets2(myvec[position]) myvec <- setdiff(myvec, falsevector) position <- position + 1 } -- 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 ______________________________________________ R-help@r-project.org 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.