Message-ID: <f8e6ff050904231650i450af6e3odbb1ad399a538e57@mail.gmail.com>
Date: 2009-04-23T23:50:32Z
From: Hadley Wickham
Subject: conditional grouping of variables: ave or tapply or by or???
In-Reply-To: <c70c324f0904231511p38ff588nf0235383dfa96d77@mail.gmail.com>
On Thu, Apr 23, 2009 at 5:11 PM, ozan bakis <ozanbakis at gmail.com> wrote:
> Dear R Users,
> I have the following data frame:
>
> v1 <- c(rep(10,3),rep(11,2))
> v2 <- sample(5:10, 5, replace = T)
> v3 <- c(0,1,2,0,2)
> df <- data.frame(v1,v2,v3)
>> df
> ?v1 v2 v3
> 1 10 ?9 ?0
> 2 10 ?5 ?1
> 3 10 ?6 ?2
> 4 11 ?7 ?0
> 5 11 ?5 ?2
>
> I want to add a new column v4 such that its values are equal to the value
> of v2 conditional on v3=0 for each subgroup of v1. In the above example,
> the final result should be like
>
> df$v4 <- c(9,9,9,7,7)
>> df
> ?v1 v2 v3 v4
> 1 10 ?9 ?0 ?9
> 2 10 ?5 ?1 ?9
> 3 10 ?6 ?2 ?9
> 4 11 ?7 ?0 ?7
> 5 11 ?5 ?2 ?7
>
>
> I tried the following commands without success.
>
> df$v4 <- ave(df$v2, df$v1, FUN=function(x) x[df$v3==0])
> tapply(df$v2, df$v1, FUN=function(x) x[df$v3==0])
> by(df$v2, df$v1, FUN=function(x) x[df$v3==0])
>
> Any help? Thanks in advance!
Here's one approach with the plyr package, http://had.co.nz/plyr
library(plyr)
ddply(df, .(v1), transform, v4 = v2[v3 == 0])
Hadley
--
http://had.co.nz/