[R] Count of rows while looping through data

Kenn Konstabel lebatsnok at gmail.com
Wed May 25 10:31:17 CEST 2011


An alternative approach would be to `split` the data frame by family,
then `lapply` a function selecting random row from each slice, and
then `rbind` it all together.

x = data.frame(family = rep(1:20,sample(2:5,20,replace=TRUE)), xyz=1)
randomrow <- function(x) x[sample(1:nrow(x),1),]

# step by step
x.split <- split(x, x$family)
x.rnd <- lapply(x.split, randomrow)
x.togetheragain <- do.call(rbind, x.rnd)

# or more concisely
do.call(rbind,      lapply(split(x, x$family), randomrow)      )

Best regards,

Kenn

On Wed, May 25, 2011 at 12:54 AM, Phil Spector
<spector at stat.berkeley.edu> wrote:
> Jeanna -
>    I can't imagine how you could solve this problem with a loop, but here's
> one way to solve it using R:
>
> First, I'll create a data frame with a family variable:
>
>> x = data.frame(family = rep(1:20,sample(2:5,20,replace=TRUE)))
>
> Next, I'll number each family member within each family:
>
>> x$seq = ave(x$family,x$family,FUN=seq)
>
> Now I'll choose a random number within each family:
>
>> x$use = ave(x$family,x$family,FUN=function(x)sample(1:length(x),1))
>
> Finally, I'll select the family member whose sequence number matches the
> random number:
>
>> answer = subset(x,seq == use)
>
> Hope this helps.  Take a look at the help page for the ave function
> to understand how it works.
>                                        - Phil Spector
>                                         Statistical Computing Facility
>                                         Department of Statistics
>                                         UC Berkeley
>                                         spector at stat.berkeley.edu
>
>
> On Tue, 24 May 2011, Jeanna wrote:
>
>> I have a data table with one column that indicates families, and
>> subsequent
>> columns with other characteristics.  I want to randomize one member of the
>> family to a separate table.  My approach is to count the number of
>> members,
>> set up a random number generator, and assign the family member based on
>> where they fall within the random number spectrum.
>>
>> Is there a way to count the number of family members as I loop through the
>> whole table?
>>
>> Something like this:
>> for (j in 1:15){
>>        if (x$family[j] == x$family[j+1]){
>>       count = count +1
>> (which doesn't work)
>>
>> as I do the larger:
>> for (i in 2:nrow(x.tab)){
>>
>>
>> --
>> View this message in context:
>> http://r.789695.n4.nabble.com/Count-of-rows-while-looping-through-data-tp3547949p3547949.html
>> Sent from the R help mailing list archive at Nabble.com.
>>
>> ______________________________________________
>> 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.
>>
>
> ______________________________________________
> 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