[R] Extract values from vector and repeat by group

arun smartpink111 at yahoo.com
Sun Nov 17 17:48:44 CET 2013


Hi,

?merge() sometimes change the order.
For example:
df1 <- df[-12,]
df2 <- df1

merge(df1, df1[df1$time == 4, c("group", "var")], by.x = "group", by.y = "group", suffixes = c("", "GroupSK0"))

In that case,

df1$ord1 <- with(df1,order(group,time))
res <- merge(df1, df1[df1$time == 4, c("group", "var")], by.x = "group", by.y = "group", suffixes = c("", "GroupSK0"))
res[order(res$ord1),-4]


#or just
library(plyr)
join(df2,df2[df2$time==4,c("group","var")],by="group",type="inner")


#or you may use:

indx <- with(df1,ave(time==4,group,FUN=any))

 ddply(df1[indx,],.(group),mutate,new=var[time==4])

A.K.






On Sunday, November 17, 2013 10:22 AM, Berend Hasselman <bhh at xs4all.nl> wrote:

On 17-11-2013, at 15:47, Benjamin Gillespie <gybrg at Leeds.ac.uk> wrote:

> Hi all,
> 
> I hope you can help.
> 
> I have a data frame 'df':
> 
> group=c(rep(1,8),rep(2,10),rep(3,11))
> var=rnorm(29)
> time=c(seq(1,8),seq(1,10),seq(1,11))
> df=data.frame(group,var,time)
> 
> I would like to extract the value from 'var' for each 'group' at 'time'=4 and repeat these extracted values in a new vector ('new') n times where n is the number of rows for each group. I did this by hand as below, but there must be a quicker way:
> 
> subset=subset(df,df$time==4)
> subset
> group        var time
> 4      1  0.2531270    4
> 12     2 -0.3600128    4
> 22     3  0.4194730    4
> 
> df$new=c(rep(0.2531270,8),rep(-0.3600128,10),rep(0.4194730,11))
> 
> Any questions please ask,

A very similar question was recently asked on Stackoverflow: http://stackoverflow.com/questions/19971763/r-programming-normalizing-a-column-of-data-by-another-entry-in-2-other-columns

From the answer given there you could try this

set.seed(11) # to make it reproducible

group=c(rep(1,8),rep(2,10),rep(3,11))
var=rnorm(29)
time=c(seq(1,8),seq(1,10),seq(1,11))
df=data.frame(group,var,time)

#df
#df[df$time==4, c("group", "var")]

# merge into original data.frame
df <- merge(df, df[df$time == 4, c("group", "var")], by.x = "group", by.y = "group", suffixes = c("", "GroupSK0"))
df

Berend


______________________________________________
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