I am trying to understand how loops in operate. I have a simple dataframe xx which is as follows COMPANY_NUMBER NUMBER_OF_YEARS #0070837 3 #0070837 3 #0070837 3 1000403 4 1000403 4 1000403 4 1000403 4 10029943 3 10029943 3 10029943 3 10037980 4 10037980 4 10037980 4 10037980 4 10057418 3 10057418 3 10057418 3 1009550 4 1009550 4 1009550 4 1009550 4 The code I have written is while (i <= nrow(xx1) ) { for (j in 1:xx1$NUMBER_OF_YEARS[i]) { xx1$I[i] <- i xx1$J[j] <- j xx1$NUMBER_OF_YEARS_j[j] <- xx1$NUMBER_OF_YEARS[j] } i=i + (xx1$NUMBER_OF_YEARS[i] ) } After running the code I want my dataframe to look like |COMPANY_NUMBER |NUMBER_OF_YEARS| | I| |J| |#0070837 |3| |1| |1| |#0070837 |3| |1| |2| |#0070837 |3| |3| |3| |1000403 |4| |1| |1| |1000403 |4| |1| |2| |1000403 |4| |1| |3| |1000403 |4| |4| |4| |10029943 |3| |1| |1| |10029943 |3| |1| |2| |10029943 |3| |3| |3| |10037980 |4| |1| |1| |10037980 |4| |1| |2| |10037980 |4| |1| |3| |10037980 |4| |4| |4| |10057418 |3| |1| |1| |10057418 |3| |1| |1| |10057418 |3| |1| |1| |1009550 |4| |1| |1| |1009550 |4| |1| |2| |1009550 |4| |1| |3| |1009550 |4| |4| |4| I get the correct value of I but in the wrong row but the vaule of J is correct in the first iteration and then it goes to 1 Any help will be greatly appreciated [[alternative HTML version deleted]]
Hi Your code is hardly readable as you used HTML formating (not recommended) so I used another (split) approach. Third column seems to be simple #make list lll <- split(as.factor(COMPANY_NUMBER), COMPANY_NUMBER) #calculate sequences as.numeric(unlist(lapply(lll, function(x) 1:length(x)))) should give you third column The second column seems to be calculated this way. lapply(lll, function(x) c(rep(1, length(x)-1), max(length(x)))) I believe others could come with simpler solutions. BTW why result for 10057418 Should be different? Cheers Petr> -----Original Message----- > From: R-help <r-help-bounces at r-project.org> On Behalf Of e-mail > ma015k3113 via R-help > Sent: Thursday, April 29, 2021 5:41 PM > To: r-help at r-project.org > Subject: [R] Help understanding loop behaviour > > I am trying to understand how loops in operate. I have a simple dataframexx> which is as follows > > COMPANY_NUMBER NUMBER_OF_YEARS > > #0070837 3 > #0070837 3 > #0070837 3 > 1000403 4 > 1000403 4 > 1000403 4 > 1000403 4 > 10029943 3 > 10029943 3 > 10029943 3 > 10037980 4 > 10037980 4 > 10037980 4 > 10037980 4 > 10057418 3 > 10057418 3 > > 10057418 3 > 1009550 4 > 1009550 4 > 1009550 4 > 1009550 4 > The code I have written is > > while (i <= nrow(xx1) ) > > { > > for (j in 1:xx1$NUMBER_OF_YEARS[i]) > { > xx1$I[i] <- i > xx1$J[j] <- j > xx1$NUMBER_OF_YEARS_j[j] <- xx1$NUMBER_OF_YEARS[j] } i=i + > (xx1$NUMBER_OF_YEARS[i] ) } After running the code I want my dataframe > to look like > > |COMPANY_NUMBER |NUMBER_OF_YEARS| | I| |J| > > |#0070837 |3| |1| |1| > |#0070837 |3| |1| |2| > |#0070837 |3| |3| |3| > |1000403 |4| |1| |1| > |1000403 |4| |1| |2| > |1000403 |4| |1| |3| > |1000403 |4| |4| |4| > |10029943 |3| |1| |1| > |10029943 |3| |1| |2| > |10029943 |3| |3| |3| > |10037980 |4| |1| |1| > |10037980 |4| |1| |2| > |10037980 |4| |1| |3| > |10037980 |4| |4| |4| > |10057418 |3| |1| |1| > |10057418 |3| |1| |1| > |10057418 |3| |1| |1| > |1009550 |4| |1| |1| > |1009550 |4| |1| |2| > |1009550 |4| |1| |3| > |1009550 |4| |4| |4| > > > I get the correct value of I but in the wrong row but the vaule of J iscorrect in> the first iteration and then it goes to 1 > > Any help will be greatly appreciated > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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 email, If you want what you described, try this: xx<-read.table(text="COMPANY_NUMBER NUMBER_OF_YEARS 0070837 3 0070837 3 0070837 3 1000403 4 1000403 4 1000403 4 1000403 4 10029943 3 10029943 3 10029943 3 10037980 4 10037980 4 10037980 4 10037980 4 10057418 3 10057418 3 10057418 3 1009550 4 1009550 4 1009550 4 1009550 4", header=TRUE,stringsAsFactors=FALSE) xx$I<-NA xx$J<-NA row_count<-1 for(row in 1:nrow(xx)) { if(row == nrow(xx) || xx$COMPANY_NUMBER[row]==xx$COMPANY_NUMBER[row+1]) { xx$I[row]<-1 xx$J[row]<-row_count row_count<-row_count+1 } else { xx$I[row]<-xx$J[row]<-xx$NUMBER_OF_YEARS[row] row_count<-1 } } xx Like Petr, I am assuming that you want company 10057418 treated the same as the others. If not, let us know why. I am also adssuming that the first three rows should _not_ have a "#" at the beginning, which means that they will be discarded. Jim On Fri, Apr 30, 2021 at 1:41 AM e-mail ma015k3113 via R-help <r-help at r-project.org> wrote:> > I am trying to understand how loops in operate. I have a simple dataframe xx which is as follows > > COMPANY_NUMBER NUMBER_OF_YEARS > > #0070837 3 > #0070837 3 > #0070837 3 > 1000403 4 > 1000403 4 > 1000403 4 > 1000403 4 > 10029943 3 > 10029943 3 > 10029943 3 > 10037980 4 > 10037980 4 > 10037980 4 > 10037980 4 > 10057418 3 > 10057418 3 > > 10057418 3 > 1009550 4 > 1009550 4 > 1009550 4 > 1009550 4 > The code I have written is > > while (i <= nrow(xx1) ) > > { > > for (j in 1:xx1$NUMBER_OF_YEARS[i]) > { > xx1$I[i] <- i > xx1$J[j] <- j > xx1$NUMBER_OF_YEARS_j[j] <- xx1$NUMBER_OF_YEARS[j] > } > i=i + (xx1$NUMBER_OF_YEARS[i] ) > } > After running the code I want my dataframe to look like > > |COMPANY_NUMBER |NUMBER_OF_YEARS| | I| |J| > > |#0070837 |3| |1| |1| > |#0070837 |3| |1| |2| > |#0070837 |3| |3| |3| > |1000403 |4| |1| |1| > |1000403 |4| |1| |2| > |1000403 |4| |1| |3| > |1000403 |4| |4| |4| > |10029943 |3| |1| |1| > |10029943 |3| |1| |2| > |10029943 |3| |3| |3| > |10037980 |4| |1| |1| > |10037980 |4| |1| |2| > |10037980 |4| |1| |3| > |10037980 |4| |4| |4| > |10057418 |3| |1| |1| > |10057418 |3| |1| |1| > |10057418 |3| |1| |1| > |1009550 |4| |1| |1| > |1009550 |4| |1| |2| > |1009550 |4| |1| |3| > |1009550 |4| |4| |4| > > > I get the correct value of I but in the wrong row but the vaule of J is correct in the first iteration and then it goes to 1 > > Any help will be greatly appreciated > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.