Or even better (doh!)...

library(plyr)
> ddply(DF0, .(A, B), summarise, C = sum(C))
    A   B   C
1  52   1 124
2  52  59  38
3  52  97  75
4  57   1  64
5  57   6  26
6  57 114  12
7  89   1 192
8  89   6  20
9  89  29 137
10 89  52  13
11 89  57  10
12 89  97  23

which means that aggregate(), summaryBy() in the doBy package and several
more functions/packages can do this quite easily.

Dennis

On Wed, Oct 20, 2010 at 3:21 AM, Dennis Murphy <[email protected]> wrote:

> Hi:
>
> Here's one way, although it can be improved a bit.
>
> d1 <- aggregate(C ~ A, data = subset(DF0, B == 1), FUN = sum)
> d2 <- subset(DF0, B != 1)
> # B not in d1, so need to replace it
> > d1
>    A   C
> 1 52 124
> 2 57  64
> 3 89 192
> d1$B <- rep(1, nrow(d1))
> d1 <- d1[, c(1, 3, 2)]   # reorder columns to permit cbinding
> DF1 <- rbind(d1, d2)
> > DF1[order(DF1$A, DF1$B), ]
>     A   B   C
> 1  52   1 124
> 19 52  59  38
> 20 52  97  75
> 2  57   1  64
> 26 57   6  26
> 24 57 114  12
> 3  89   1 192
> 21 89   6  20
> 31 89  29 137
> 4  89  52  13
> 5  89  57  10
> 6  89  97  23
>
> HTH,
> Dennis
>
>
> On Wed, Oct 20, 2010 at 2:42 AM, xtracto <[email protected]> wrote:
>
>>
>> Hello,
>>
>> I am trying to achieve something which I *think* is possible using rowsum,
>> but a little help should be useful:
>>
>> Consider the following dataframe DF0:
>> A       B       C
>> 89      1       140
>> 89      06      20
>> 89      29      137
>> 89      52      13
>> 89      57      10
>> 89      97      23
>> 89      1       37
>> 89      1       12
>> 89      1       3
>> 52      1       11
>> 52      1       31
>> 52      1       16
>> 52      1       6
>> 52      1       10
>> 52      1       13
>> 52      1       10
>> 52      1       25
>> 52      1       2
>> 52      59      38
>> 52      97      75
>> 57      1       14
>> 57      1       13
>> 57      1       14
>> 57      114     12
>> 57      1       23
>> 57      06      26
>>
>>
>> I need create a new dataframe containing the sums of all the rows where B
>> =
>> 1 for the different values of A, keeping the rows with other B values the
>> same. That is, for this data sample, the result I expect is something like
>> this (the order of the rows does not matter):
>>
>> A       B       C
>> 89      1       192    #From adding up: [140 + 37 + 12 + 3]
>> 89      06      20
>> 89      29      137
>> 89      52      13
>> 89      57      10
>> 89      97      23
>> 52      1       124    # From adding up: [11 + 31 + 16 + 6 + 10 + 13 + 10
>> + 25 + 2]
>> 52      59      38
>> 52      97      75
>> 57      1       64     #From adding up: [14 +13 +14 +23]
>> 57      114     12
>> 57      06      26
>>
>>
>> Now, I now it should be possible to first separate the data in two sets,
>> where
>> DF1 <- DF0[DF0$B != 1,]
>> DF2 <- DF0[DF0$B == 1,]
>>
>> Then I should apply sumrow to DF2 with some "group" vector, but I do not
>> know where to go from here.
>>
>> Can anyone help?
>> Thanks in advance!
>>
>>
>> --
>> View this message in context:
>> http://r.789695.n4.nabble.com/rowsum-tp3003551p3003551.html
>> Sent from the R help mailing list archive at Nabble.com.
>>
>> ______________________________________________
>> [email protected] 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.
>>
>
>

        [[alternative HTML version deleted]]

______________________________________________
[email protected] 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.

Reply via email to