[R] data frame question

David Winsemius dwinsemius at comcast.net
Sun Feb 10 21:52:03 CET 2008


joseph <jdsandjd at yahoo.com> wrote in
news:109232.80965.qm at web36905.mail.mud.yahoo.com: 

> I have 2 data frames df1 and df2. I would like to create a
> new data frame new_df which will contain only the common rows based
> on the first 2 columns (chrN and start). The column score in the new
> data frame should
> be replaced with a column containing the average score
> (average_score) from df1 and df2. 
> 

> df1= data.frame(chrN= c("chr1", "chr1", "chr1", "chr1", "chr2",
> "chr2", "chr2"), 
> start= c(23, 82, 95, 108, 95, 108, 121),
> end= c(33, 92, 105, 118, 105, 118, 131),
> score= c(3, 6, 2, 4, 9, 2, 7))
> 
> df2= data.frame(chrN= c("chr1", "chr2", "chr2", "chr2" , "chr2"),
> start= c(23, 50, 95, 20, 121),
> end= c(33, 60, 105, 30, 131),
> score= c(9, 3, 7, 7, 3))

Clunky to be sure, but this should worked for me:

df3 <- merge(df1,df2,by=c("chrN","start")
#non-match variables get auto-relabeled

df3$avg.scr <- with(df3, (score.x+score.y)/2) # or mean( )
df3 <- df3[,c("chrN","start","avg.scr")]
#drops the variables not of interest

df3
  chrN start avg.scr
1 chr1    23       6
2 chr2   121       5
3 chr2    95       8

-- 
David Winsemius



More information about the R-help mailing list