Skip to content
Back to formatted view

Raw Message

Message-ID: <CAM_vjumLQCrrnDo_1D+QS0mc4vPZW5oW7O5S2i1Zn=W3GKs3Wg@mail.gmail.com>
Date: 2013-12-13T21:35:50Z
From: Sarah Goslee
Subject: dataframe manipulation
In-Reply-To: <CAHmzXO5Wth05HDt=YxbEAXoG9Jy3+PMaaxWjzQ52OTwPG_9XwQ@mail.gmail.com>

What about:

lapply(levels(d$fac), function(x)head(d[d$fac == x,], 1))


Thanks for the reproducible example. If you put set.seed(123) before
the call to sample, then everyone who tries it will get the same data
frame d.

Sarah


On Fri, Dec 13, 2013 at 4:15 PM, Gang Chen <gangchen6 at gmail.com> wrote:
> Suppose I have a dataframe defined as
>
>      L3 <- LETTERS[1:3]
>      (d <- data.frame(cbind(x = 1, y = 1:10), fac = sample(L3, 10, replace
> = TRUE)))
>
>    x  y fac
> 1  1  1   C
> 2  1  2   A
> 3  1  3   B
> 4  1  4   C
> 5  1  5   B
> 6  1  6   B
> 7  1  7   A
> 8  1  8   A
> 9  1  9   B
> 10 1 10   A
>
> I want to extract those rows that are the first occurrences for each level
> of factor 'fac', which are basically the first three rows above. How can I
> achieve that? The real dataframe is more complicated than the example
> above, and I can't simply list all the levels of factor 'fac' by
> exhaustibly listing all the levels like the following
>
> d[d$fac=='A' | d$fac=='B' | d$fac=='C', ]
>
> Thanks,
> Gang

-- 
Sarah Goslee
http://www.functionaldiversity.org