[R] Help understanding loop behaviour

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Sat May 1 00:56:18 CEST 2021


Hello,

Right, thanks. I should be


xx$I <- ave(xx$NUMBER_OF_YEARS, xx$COMPANY_NUMBER, FUN = function(x){
         c(rep(1, length(x) - 1), length(x))  ### ???
     })


Hope this helps,

Rui Barradas

Às 19:46 de 30/04/21, Bert Gunter escreveu:
> There is something wrong here I believe -- see inline below:
> 
> Bert Gunter
> 
> "The trouble with having an open mind is that people keep coming along 
> and sticking things into it."
> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
> 
> 
> On Fri, Apr 30, 2021 at 10:37 AM Rui Barradas <ruipbarradas using sapo.pt 
> <mailto:ruipbarradas using sapo.pt>> wrote:
> 
>     Hello,
> 
>     For column J, ave/seq_along seems to be the simplest. For column I, ave
>     is also a good option, it avoids split/lapply.
> 
> 
>     xx$I <- ave(xx$NUMBER_OF_YEARS, xx$COMPANY_NUMBER, FUN = function(x){
>         c(rep(1, length(x) - 1), max(length(x)))  ### ???
>     })
> 
> **********
> length() returns a single integer, so max(length(x)) makes no sense
> ************************************
> 
>     xx$J <- ave(xx$NUMBER_OF_YEARS, xx$COMPANY_NUMBER, FUN = seq_along)
> 
> 
>     Hope this helps,
> 
>     Às 11:49 de 30/04/21, PIKAL Petr escreveu:
>      > Hallo,
>      >
>      > Sorry, my suggestion did not worked in your case correctly as
>     split used
>      > natural factor ordering.
>      >
>      > So using Jim's data, this results in desired output.
>      >
>      > #prepare factor in original ordering
>      > ff <- factor(xx[,1], levels=unique(xx[,1]))
>      > lll <- split(xx$COMPANY_NUMBER, ff)
>      > xx$I <- unlist(lapply(lll, function(x) c(rep(1, length(x)-1),
>      > max(length(x)))),use.names=FALSE)
>      > xx$J <- unlist(lapply(lll, function(x) 1:length(x)), use.names=FALSE)
>      >> xx
>      >     COMPANY_NUMBER NUMBER_OF_YEARS I J
>      > 1           70837               3 1 1
>      > 2           70837               3 1 2
>      > 3           70837               3 3 3
>      > 4         1000403               4 1 1
>      > 5         1000403               4 1 2
>      > 6         1000403               4 1 3
>      > 7         1000403               4 4 4
>      > 8        10029943               3 1 1
>      > 9        10029943               3 1 2
>      > 10       10029943               3 3 3
>      > 11       10037980               4 1 1
>      > 12       10037980               4 1 2
>      > 13       10037980               4 1 3
>      > 14       10037980               4 4 4
>      > 15       10057418               3 1 1
>      > 16       10057418               3 1 2
>      > 17       10057418               3 3 3
>      > 18        1009550               4 1 1
>      > 19        1009550               4 1 2
>      > 20        1009550               4 1 3
>      > 21        1009550               4 4 4
>      >
>      > Cheers.
>      > Petr
>      >
>      >> -----Original Message-----
>      >> From: R-help <r-help-bounces using r-project.org
>     <mailto:r-help-bounces using r-project.org>> On Behalf Of Jim Lemon
>      >> Sent: Friday, April 30, 2021 11:45 AM
>      >> To: e-mail ma015k3113 <ma015k3113 using blueyonder.co.uk
>     <mailto:ma015k3113 using blueyonder.co.uk>>; r-help mailing list
>      >> <r-help using r-project.org <mailto:r-help using r-project.org>>
>      >> Subject: Re: [R] Help understanding loop behaviour
>      >>
>      >> 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 using r-
>      >> project.org <http://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 using r-project.org <mailto:R-help using r-project.org> mailing list
>     -- To UNSUBSCRIBE and more, see
>      >>> https://stat.ethz.ch/mailman/listinfo/r-help
>     <https://stat.ethz.ch/mailman/listinfo/r-help>
>      >>> PLEASE do read the posting guide
>      >>> http://www.R-project.org/posting-guide.html
>     <http://www.R-project.org/posting-guide.html>
>      >>> and provide commented, minimal, self-contained, reproducible code.
>      >>
>      >> ______________________________________________
>      >> R-help using r-project.org <mailto:R-help using r-project.org> mailing list
>     -- To UNSUBSCRIBE and more, see
>      >> https://stat.ethz.ch/mailman/listinfo/r-help
>     <https://stat.ethz.ch/mailman/listinfo/r-help>
>      >> PLEASE do read the posting guide
>     http://www.R-project.org/posting- <http://www.R-project.org/posting->
>      >> guide.html
>      >> and provide commented, minimal, self-contained, reproducible code.
>      >>
>      >> ______________________________________________
>      >> R-help using r-project.org <mailto:R-help using r-project.org> mailing list
>     -- To UNSUBSCRIBE and more, see
>      >> https://stat.ethz.ch/mailman/listinfo/r-help
>     <https://stat.ethz.ch/mailman/listinfo/r-help>
>      >> PLEASE do read the posting guide
>     http://www.R-project.org/posting-guide.html
>     <http://www.R-project.org/posting-guide.html>
>      >> and provide commented, minimal, self-contained, reproducible code.
> 
>     ______________________________________________
>     R-help using r-project.org <mailto:R-help using r-project.org> mailing list --
>     To UNSUBSCRIBE and more, see
>     https://stat.ethz.ch/mailman/listinfo/r-help
>     <https://stat.ethz.ch/mailman/listinfo/r-help>
>     PLEASE do read the posting guide
>     http://www.R-project.org/posting-guide.html
>     <http://www.R-project.org/posting-guide.html>
>     and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list