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.