Hello, Newbie question and hope you can help . I have two vector V1 and V2, where length(V2) = length of (V1) * 2; length(V1) ~ 16,000. For each member in V1, I need to compare 2 element of V2 for equality i.e. for (I in 1:length (V1)) { if ( v2[i] == v1[i] & v2[i+1]==v1[i] ){ statement_1 statement_2 . } } This for-loop is too slow (it takes a good 5 minutes on my Windows machine) to finish processing the vector V1 of 16,000; I will need to process a lot more than 16,000 (about 300*16,000). Is there a better way to do looping with R? Any help is greatly appreciate --MyC. [[alternative HTML version deleted]]
My Coyne wrote:> Hello, > > > > Newbie question and hope you can help . > > I have two vector V1 and V2, where length(V2) = length of (V1) * 2; > length(V1) ~ 16,000. > > For each member in V1, I need to compare 2 element of V2 for equalityIf just the comparison is concerned, you can do it in vectorized form, but I am not sure of you want to comapre v1[i] with v2[i] and v2[i+1], otherwise it would not make sense that length(V2) = length of (V1) * 2 ... Say length(V1) is n, do you want to compare v1[1] with v2[1] and v2[2] and v1[2] with v2[3] and v2[4] or v1[1] with v2[1] and v2[n+1] and v1[2] with v2[2] and v2[n+2] ??? Uwe Ligges> > > i.e. > > for (I in 1:length (V1)) { > > if ( v2[i] == v1[i] & v2[i+1]==v1[i] ){ > > statement_1 > > statement_2 > > . > > } > > } > > > > This for-loop is too slow (it takes a good 5 minutes on my Windows machine) > to finish processing the vector V1 of 16,000; I will need to process a lot > more than 16,000 (about 300*16,000). > > > > Is there a better way to do looping with R? Any help is greatly appreciate > > > > --MyC. > > > > > > > > > > > > > > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at 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.
WRT: Say length(V1) is n, do you want to compare> v1[1] with v2[1] and v2[2] and v1[2] with v2[3] and v2[4] > or > v1[1] with v2[1] and v2[n+1] and v1[2] with v2[2] and v2[n+2]v1[1] with (v2[1] and v2[2]) v1[2] with (v2[3] and v2[4]) v1[3] with (v2[5] and v2[6]) .... ... v1[n] with (v2[n+1] and v2[n+2]) I hope this is clear (I think I was wrong in the snippet of code earlier). Thanks in advance. --MyC> > > My Coyne wrote: >> Hello, >> >> >> >> Newbie question and hope you can help . >> >> I have two vector V1 and V2, where length(V2) = length of (V1) * 2; >> length(V1) ~ 16,000. >> >> For each member in V1, I need to compare 2 element of V2 for equality > > > If just the comparison is concerned, you can do it in vectorized form, > but I am not sure of you want to comapre v1[i] with v2[i] and v2[i+1], > otherwise it would not make sense that length(V2) = length of (V1) * 2 > ... > > Say length(V1) is n, do you want to compare > > v1[1] with v2[1] and v2[2] and v1[2] with v2[3] and v2[4] > or > v1[1] with v2[1] and v2[n+1] and v1[2] with v2[2] and v2[n+2] > > ??? > > Uwe Ligges > > > > > > >> >> >> i.e. >> >> for (I in 1:length (V1)) { >> >> if ( v2[i] == v1[i] & v2[i+1]==v1[i] ){ >> >> statement_1 >> >> statement_2 >> >> . >> >> } >> >> } >> >> >> >> This for-loop is too slow (it takes a good 5 minutes on my Windows >> machine) >> to finish processing the vector V1 of 16,000; I will need to process a >> lot >> more than 16,000 (about 300*16,000). >> >> >> >> Is there a better way to do looping with R? Any help is greatly >> appreciate >> >> >> >> --MyC. >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at 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. >
mcoyne at boninc.com wrote:> WRT: Say length(V1) is n, do you want to compare >> v1[1] with v2[1] and v2[2] and v1[2] with v2[3] and v2[4] >> or >> v1[1] with v2[1] and v2[n+1] and v1[2] with v2[2] and v2[n+2] > > v1[1] with (v2[1] and v2[2]) > v1[2] with (v2[3] and v2[4]) > v1[3] with (v2[5] and v2[6]) > .... > ... > v1[n] with (v2[n+1] and v2[n+2])So you end up with all comparisons by: v2m <- matrix(v2, ncol=2, byrow=TRUE) logical_result <- (v1 == v2m[,1]) & (v1 == v2m[,2]) Now you can (1) apply vectorized statements (e.g. using ifelse()) OR (if 1 is impossible) (2): for (I in which(logical_result)) { statement_1 statement_2 } Uwe Ligges> I hope this is clear (I think I was wrong in the snippet of code earlier). > Thanks in advance. > > --MyC > >> >> My Coyne wrote: >>> Hello, >>> >>> >>> >>> Newbie question and hope you can help . >>> >>> I have two vector V1 and V2, where length(V2) = length of (V1) * 2; >>> length(V1) ~ 16,000. >>> >>> For each member in V1, I need to compare 2 element of V2 for equality >> >> If just the comparison is concerned, you can do it in vectorized form, >> but I am not sure of you want to comapre v1[i] with v2[i] and v2[i+1], >> otherwise it would not make sense that length(V2) = length of (V1) * 2 >> ... >> >> Say length(V1) is n, do you want to compare >> >> v1[1] with v2[1] and v2[2] and v1[2] with v2[3] and v2[4] >> or >> v1[1] with v2[1] and v2[n+1] and v1[2] with v2[2] and v2[n+2] >> >> ??? >> >> Uwe Ligges >> >> >> >> >> >> >>> >>> i.e. >>> >>> for (I in 1:length (V1)) { >>> >>> if ( v2[i] == v1[i] & v2[i+1]==v1[i] ){ >>> >>> statement_1 >>> >>> statement_2 >>> >>> . >>> >>> } >>> >>> } >>> >>> >>> >>> This for-loop is too slow (it takes a good 5 minutes on my Windows >>> machine) >>> to finish processing the vector V1 of 16,000; I will need to process a >>> lot >>> more than 16,000 (about 300*16,000). >>> >>> >>> >>> Is there a better way to do looping with R? Any help is greatly >>> appreciate >>> >>> >>> >>> --MyC. >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________________________ >>> R-help at 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. > >
Hi Uwe, Thank you so much for your help. It works great with your suggestion/help. WOW, what a difference! --MyC> > > mcoyne at boninc.com wrote: >> WRT: Say length(V1) is n, do you want to compare >>> v1[1] with v2[1] and v2[2] and v1[2] with v2[3] and v2[4] >>> or >>> v1[1] with v2[1] and v2[n+1] and v1[2] with v2[2] and v2[n+2] >> >> v1[1] with (v2[1] and v2[2]) >> v1[2] with (v2[3] and v2[4]) >> v1[3] with (v2[5] and v2[6]) >> .... >> ... >> v1[n] with (v2[n+1] and v2[n+2]) > > > So you end up with all comparisons by: > > v2m <- matrix(v2, ncol=2, byrow=TRUE) > logical_result <- (v1 == v2m[,1]) & (v1 == v2m[,2]) > > Now you can (1) apply vectorized statements (e.g. using ifelse()) OR (if > 1 is impossible) (2): > > for (I in which(logical_result)) { > statement_1 > statement_2 > } > > > Uwe Ligges > > >> I hope this is clear (I think I was wrong in the snippet of code >> earlier). >> Thanks in advance. >> >> --MyC >> >>> >>> My Coyne wrote: >>>> Hello, >>>> >>>> >>>> >>>> Newbie question and hope you can help . >>>> >>>> I have two vector V1 and V2, where length(V2) = length of (V1) * 2; >>>> length(V1) ~ 16,000. >>>> >>>> For each member in V1, I need to compare 2 element of V2 for equality >>> >>> If just the comparison is concerned, you can do it in vectorized form, >>> but I am not sure of you want to comapre v1[i] with v2[i] and v2[i+1], >>> otherwise it would not make sense that length(V2) = length of (V1) * 2 >>> ... >>> >>> Say length(V1) is n, do you want to compare >>> >>> v1[1] with v2[1] and v2[2] and v1[2] with v2[3] and v2[4] >>> or >>> v1[1] with v2[1] and v2[n+1] and v1[2] with v2[2] and v2[n+2] >>> >>> ??? >>> >>> Uwe Ligges >>> >>> >>> >>> >>> >>> >>>> >>>> i.e. >>>> >>>> for (I in 1:length (V1)) { >>>> >>>> if ( v2[i] == v1[i] & v2[i+1]==v1[i] ){ >>>> >>>> statement_1 >>>> >>>> statement_2 >>>> >>>> . >>>> >>>> } >>>> >>>> } >>>> >>>> >>>> >>>> This for-loop is too slow (it takes a good 5 minutes on my Windows >>>> machine) >>>> to finish processing the vector V1 of 16,000; I will need to process >>>> a >>>> lot >>>> more than 16,000 (about 300*16,000). >>>> >>>> >>>> >>>> Is there a better way to do looping with R? Any help is greatly >>>> appreciate >>>> >>>> >>>> >>>> --MyC. >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> [[alternative HTML version deleted]] >>>> >>>> ______________________________________________ >>>> R-help at 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. >> >> >
Seemingly Similar Threads
- Retrieve only part of a matrix
- In chisq.test(x) : Chi-squared approximation may be incorrect
- Rgraphviz and R 2.5.1 entry point Rf_allocString could not be located
- Could not install aroma.affymetrix
- How to handle Which on two matrices that do not have same number of rows