[R] ifelse to speed up loop?

arun smartpink111 at yahoo.com
Fri Jan 25 07:11:10 CET 2013


Hi,
If variable `V1` is factor and it follows the same pattern as in your example:
test<- structure(list(V1 = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 
1L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor")), .Names = "V1", class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))

test$group<-cumsum(c(1,abs(diff(as.integer(test[,1]))))) #works

#But, if it is like this:
test1<- structure(list(V1 = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 
1L, 3L, 3L, 3L), .Label = c("a", "b", "d"), class = "factor")), .Names = "V1", class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))
 test1$group<-cumsum(c(1,abs(diff(as.integer(test1[,1]))))) #may not work well (depends on your expected result)
 v<- test1[,1] #Bill's solution
test1$group2<-cumsum(c(TRUE, v[-length(v)] != v[-1] ))# works
 test1
#  V1 group group2
#1   a     1      1
#2   a     1      1
#3   a     1      1
#4   b     2      2
#5   b     2      2
#6   b     2      2
#7   a     3      3
#8   a     3      3
#9   a     3      3
#10  d     5      4
#11  d     5      4
#12  d     5      4

A.K.







----- Original Message -----
From: Jeff <fuertejn at mymail.vcu.edu>
To: arun <smartpink111 at yahoo.com>
Cc: Jeffrey Fuerte <fuertejn at vcu.edu>; R help <r-help at r-project.org>
Sent: Thursday, January 24, 2013 7:08 PM
Subject: Re: [R] ifelse to speed up loop?

Thank you for the tips. I should mention that the V1 is numeric in this case but I am trying to automate the overall procedure so it may not be numeric always. Would that matter with these functions?

Sent from my iPhone

On Jan 24, 2013, at 6:34 PM, arun <smartpink111 at yahoo.com> wrote:

> Hi,
> You could do this:
> test<-read.table(text="
>   V1
> 1  1
> 2  1
> 3  1
> 4  2
> 5  2
> 6  2
> 7  1
> 8  1
> 9  1
> 10  2
> 11  2
> 12  2
> ",sep="",header=T)
> 
>  test$Group<-cumsum(abs(c(0,diff(test[,1]))))+1
> test
> #   V1 Group
> #1   1     1
> #2   1     1
> #3   1     1
> #4   2     2
> #5   2     2
> #6   2     2
> #7   1     3
> #   1     3
> #9   1     3
> #10  2     4
> #11  2     4
> #12  2     4
> A.K.
> 
> 
> 
> ----- Original Message -----
> From: Jeffrey Fuerte <fuertejn at vcu.edu>
> To: r-help at r-project.org
> Cc: 
> Sent: Thursday, January 24, 2013 4:20 PM
> Subject: [R] ifelse to speed up loop?
> 
> Hello,
> 
> I'm not sure how to explain what I'm looking for but essentially I have a
> test dataset that looks like this:
> 
> test:
>    V1
> 1   1
> 2   1
> 3   1
> 4   2
> 5   2
> 6   2
> 7   1
> 8   1
> 9   1
> 10  2
> 11  2
> 12  2
> 
> And what I want to be able to do is create another column that captures a
> "grouping" variable that looks like this:
> 
> test
>    V1 group
> 1   1  1
> 2   1  1
> 3   1  1
> 4   2  2
> 5   2  2
> 6   2  2
> 7   1 3
> 8   1  3
> 9   1  3
> 10  2  4
> 11  2  4
> 12  2  4
> 
> So, it's keeping track of the changes in V1, but even though V1 could be
> the same in different instances, the group is treating it as a new group.
> I have written a loop that does what I want, but this takes too long to
> run, so I was hoping for either a faster approach or an ifelse statement.
> Any ideas?
> 
> By the loop I was using looks like this:
> 
> groupings <- 1
> test$group[1] <- groupings
> for (i in 2:length(test$V1))
> {
> if (test$V1[i]==test$V1[i-1])
> {
> test$group[i] <- groupings
> } else {
> groupings <- groupings+1
> test$group[i] <- groupings
> }
> }
> 
> Thanks for the help.
> 
>     [[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.
> 




More information about the R-help mailing list