[R] data frame manipulation with condition
Sarah Goslee
sarah.goslee at gmail.com
Fri Feb 24 18:39:00 CET 2012
On Fri, Feb 24, 2012 at 12:23 PM, William Dunlap <wdunlap at tibco.com> wrote:
> Use mult[as.character(df$x)] instead of mult[df$x].
> They are different when df$x is a factor and the
> character version is what you want.
R will coerce a factor to character to perform the comparison; explicitly
calling as.character() is not necessary:
> df$x
[1] AA BB CC AA DD DD
> df$x == "AA"
[1] TRUE FALSE FALSE TRUE FALSE FALSE
See ?factor for details.
Sarah
> > df<- data.frame(x = c("AA","BB","CC","AA","DD","DD"), y = 1:6)
> > mult <- c(AA = 10, BB = 25,DD=15)
> > df$y <- df$y * mult[as.character(df$x)]
> > df
> x y
> 1 AA 10
> 2 BB 50
> 3 CC NA
> 4 AA 40
> 5 DD 75
> 6 DD 90
>
> This gets the order right. The NA for "CC" is because
> your vector of multipliers didn't include an entry for
> CC. You can either add CC=1 to mult or work only on the
> subset of the data which has entries in the mult vector.
>
> > df<- data.frame(x = c("AA","BB","CC","AA","DD","DD"), y = 1:6)
> > mult <- c(AA = 10, BB = 25,DD=15)
> > i <- as.character(df$x) %in% names(mult)
> > df$y[i] <- df$y[i] * mult[as.character(df$x[i])]
> > df
> x y
> 1 AA 10
> 2 BB 50
> 3 CC 3
> 4 AA 40
> 5 DD 75
> 6 DD 90
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
>> -----Original Message-----
>> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Arnaud Gaboury
>> Sent: Friday, February 24, 2012 8:37 AM
>> To: Uwe Ligges
>> Cc: r-help at r-project.org
>> Subject: Re: [R] data frame manipulation with condition
>>
>> > df<- data.frame(x = c("AA","BB","CC","AA","DD","DD"), y = 1:6)
>> > mult <- c(AA = 10, BB = 25,DD=15)
>> > df$y <- df$y * mult[df$x]
>> > df
>> x y
>> 1 AA 10
>> 2 BB 50
>> 3 CC 45
>> 4 AA 40
>> 5 DD NA
>> 6 DD NA
>>
>> My df is in fact much more longer than the chosen example shown here. It seems your tip didn't do the
>> job.
>> I am expecting this as result :
>>
>> > df
>> x y
>> 1 AA 10 ----> if df$x==AA, df$y<-1*10
>> 2 BB 50 ----> if df$x==BB, df$y<-2*25
>> 3 CC 3 NOTHING
>> 4 AA 40 ----> if df$x==AA, df$y<-4*10
>> 5 DD 75 ----> if df$x==DD, df$y<-5*15
>> 6 DD 90 ----> if df$x==DD, df$y<-6*15
>>
>> Arnaud Gaboury
>>
>> A2CT2 Ltd.
>>
>> -----Original Message-----
>> From: Uwe Ligges [mailto:ligges at statistik.tu-dortmund.de]
>> Sent: vendredi 24 février 2012 17:07
>> To: Arnaud Gaboury
>> Cc: r-help at r-project.org
>> Subject: Re: [R] data frame manipulation with condition
>>
>>
>>
>> On 24.02.2012 16:59, Arnaud Gaboury wrote:
>> > TY Uwe,
>> >
>> > So I will have to write a line for each condition? Right?
>> >
>> > In fact I was trying to do something with apply in one line, but couldn't achieve any result. In
>> fact, all my transformation will be multiplying one object by a specific number according to the value
>> of df$x.
>>
>> In that case:
>>
>> mult <- c(AA = 10, BB = 25)
>>
>> Then:
>>
>>
>> df$y <- df$y * mult[df$x]
>>
>>
>> Uwe Ligges
>>
>>
>> >
>> > Arnaud Gaboury
>> >
>> > A2CT2 Ltd.
>> >
>> >
>> > -----Original Message-----
>> > From: Uwe Ligges [mailto:ligges at statistik.tu-dortmund.de]
>> > Sent: vendredi 24 février 2012 16:33
>> > To: Arnaud Gaboury
>> > Cc: r-help at r-project.org
>> > Subject: Re: [R] data frame manipulation with condition
>> >
>> >
>> >
>> > On 24.02.2012 16:25, Arnaud Gaboury wrote:
>> >> Dear list,
>> >>
>> >> n00b question, but still can't find any easy answer.
>> >>
>> >> Here is a df:
>> >
>> >
>> > Change
>> >
>> >>> df<-data.frame(cbind(x=c("AA","BB","CC","AA"),y=1:4))
>> >
>> > to
>> >
>> > df<- data.frame(x = c("AA","BB","CC","AA"), y = 1:4)
>> >
>> > to make your object a sensible data.frame.
>> >
>> >
>> >
>> >>> df
>> >> x y
>> >> 1 AA 1
>> >> 2 BB 2
>> >> 3 CC 3
>> >> 4 AA 4
>> >>
>> >>
>> >> I want to modify this df this way :
>> >> if df$x=="AA" then df$y=df$y*10
>> >
>> > df$y[df$x=="AA"]<- df$y[df$x=="AA"] * 25
>> >
>> > ...
>> >
>> >
>> > Uwe Ligges
>> >
>> >
>> >> if df$x=="BB" then df$y=df$y*25
>> >
>> >
>> >
>> >
>> >> and so on with other conditions.
>> >>
>> >> TY for any help.
>> >>
>> >> Trading
>> >>
>> >> A2CT2 Ltd.
>> >>
More information about the R-help
mailing list