Bob Settlage
Bob Settlage

Reputation: 25

R summaryBy or other summary method

I am trying to create a summary table and having a mental hang up. Essentially, what I think I want is a summaryBy statement getting colSums for the subsets for ALL columns except the factor to summarize on.

My data frame looks like this:

                   Cluster GO:0003677 GO:0003700 GO:0046872 GO:0008270 GO:0043565 GO:0005524
comp103680_c0      10          0          0          0          0          0          1
comp103947_c0       3          0          0          0          0          0          0
comp104660_c0       1          1          1          0          0          0          0
comp105255_c0       10          0          0          0          0          0          0

What I would like to do is get colSums for all columns after Cluster using Cluster as the grouping factor.

I have tried a bunch of things. The last was the ply ddply

> groupColumns = "Cluster"
> dataColumns = colnames(GO_matrix_MF[,2:ncol(GO_matrix_MF)])
> res = ddply(GO_matrix_MF, groupColumns, function(x) colSums(GO_matrix_MF[dataColumns]))
> head(res)
  Cluster GO:0003677 GO:0003700 GO:0046872 GO:0008270 GO:0043565 GO:0005524 GO:0004674 GO:0045735
1       1        121        138        196         94         43        213         97         20
2       2        121        138        196         94         43        213         97         20

I am not sure what the return values represent, but they do not represent the colSums

Upvotes: 1

Views: 259

Answers (2)

jazzurro
jazzurro

Reputation: 23574

I think you are looking for something like this. I modified your data a bit. There are other options too.

# Modified data
foo <- structure(list(Cluster = c(10L, 3L, 1L, 10L), GO.0003677 = c(11L, 
0L, 1L, 5L), GO.0003700 = c(0L, 0L, 1L, 0L), GO.0046872 = c(0L, 
9L, 0L, 0L), GO.0008270 = c(0L, 0L, 0L, 0L), GO.0043565 = c(0L, 
0L, 0L, 0L), GO.0005524 = c(1L, 0L, 0L, 0L)), .Names = c("Cluster", 
"GO.0003677", "GO.0003700", "GO.0046872", "GO.0008270", "GO.0043565", 
"GO.0005524"), class = "data.frame", row.names = c("comp103680_c0", 
"comp103947_c0", "comp104660_c0", "comp105255_c0"))

library(dplyr)
foo %>%
    group_by(Cluster) %>%
    summarise_each(funs(sum))

# Cluster GO.0003677 GO.0003700 GO.0046872 GO.0008270 GO.0043565 GO.0005524
#1       1          1          1          0          0          0          0
#2       3          0          0          9          0          0          0
#3      10         16          0          0          0          0          1

Upvotes: 1

rnso
rnso

Reputation: 24623

Try:

> aggregate(.~Cluster, data=ddf, sum)
  Cluster GO.0003677 GO.0003700 GO.0046872 GO.0008270 GO.0043565 GO.0005524
1       1          1          1          0          0          0          0
2       3          0          0          0          0          0          0
3      10          0          0          0          0          0          1

Upvotes: 1

Related Questions