[R] Follow-up Question: data frames; matching/merging

Jonathan jonsleepy at gmail.com
Mon Feb 8 19:05:13 CET 2010


Wow.. thanks for the deluge of responses!

Aggregate seems like the way to go here.

But, suppose that instead of integers in column V2, I actually have
dates (and instead of keeping the minimum integer, I want to keep the
earliest date):

> df = data.frame(V1=c(1,1,2,3,1,2),V2=c('2002-03-13','1989-03-10','1988-01-20','1997-05-15','1996-11-18','2000-01-12'));
> aggregate(df$V2,df['V1'],min) #thanks, Phil
Error in Summary.factor(c(6L, 2L, 3L), na.rm = FALSE) :
  min not meaningful for factors

So I checked:
> min(df$V2)
Error in Summary.factor(c(6L, 2L, 1L, 4L, 3L, 5L), na.rm = FALSE) :
  min not meaningful for factors

This can be fixed with:
> min(as.Date(df$V2))
[1] "1988-01-20"


However, I get a strange response when I try:
> aggregate(as.Date(df$V2),df['V1'],min)
  V1    x
1  1 7008
2  2 6593
3  3 9996

What I'm looking for, of course, is:
> aggregate(as.Date(df$V2),df['V1'],min)
  V1    V2
1  1   1996-11-18
2  2   1988-01-20
3  3   1997-05-15


Any idea how to produce the desired output?

Thanks,
Jonathan



On Mon, Feb 8, 2010 at 12:11 PM, Gabor Grothendieck
<ggrothendieck at gmail.com> wrote:
> Here are 3 solutions assuming DF contains the data frame:
>
>> # 1. aggregate
>> aggregate(DF[2], DF[1], min)
>  V1 V2
> 1  a  2
> 2  b  9
> 3  c  4
>
>> # 2. aggregate.formula - requires R 2.11.x
>> aggregate(V2 ~ V1, DF, min)
>  V1 V2
> 1  a  2
> 2  b  9
> 3  c  4
>
>> # 3. SQL using sqldf
>> library(sqldf)
>> sqldf("select V1, min(V2) V2 from DF group by V1")
>  V1 V2
> 1  a  2
> 2  b  9
> 3  c  4
>
>> # 4. summaryBy in the doBy package
>> library(doBy)
>> summaryBy(V2 ~., DF, FUN = min, keep.names = TRUE)
>  V1 V2
> 1  a  2
> 2  b  9
> 3  c  4
>
> On Mon, Feb 8, 2010 at 11:39 AM, Jonathan <jonsleepy at gmail.com> wrote:
>> Hi all,
>>    I'm feeling a little guilty to ask this question, since I've
>> written a solution using a rather clunky for loop that gets the job
>> done.  But I'm convinced there must be a faster (and probably more
>> elegant) way to accomplish what I'm looking to do (perhaps using the
>> "merge" function?).  I figured somebody out there might've already
>> figured this out:
>>
>> I have a dataframe with two columns (let's call them V1 and V2).  All
>> rows are unique, although column V1 has several redundant entries.
>>
>> Ex:
>>
>>     V1     V2
>> 1    a        3
>> 2    a        2
>> 3    b        9
>> 4    c        4
>> 5    a        7
>> 6    b        11
>>
>>
>> What I'd like is to return a dataframe cut down to have only unique
>> entires in V1.  V2 should contain a vector, for each V1, that is the
>> minimum of all the possible choices from the set of redundant V1's.
>>
>> Example output:
>>
>>      V1     V2
>> 1     a        2
>> 2     b        9
>> 3     c        4
>>
>>
>> If somebody could (relatively easily) figure out how to get closer to
>> a solution, I'd appreciate hearing how.  Also, I'd be interested to
>> hear how you came upon the answer (so I can get better at searching
>> the R resources myself).
>>
>> Regards,
>> Jonathan
>>
>> ______________________________________________
>> 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