2012-08-03 95 views
0

我陷入了一件小事。我有这样通过列中的循环元素折叠数据帧[R]

chrom exonCount 
chr1   3 
chr1   4 
chr1   5 
chr1   5 
chr1   9 
chr1  10 
chr2   7 
chr2  11 
chr2  13 
chr3   7 
chr4   7 

我只想输出R中的数据帧

chr1  36 
chr2  31 
chr3   7 
chr4   7 

我承担聚集功能,可以这样做,但我在使用中丢失。

感谢

如果你想使用plyr尝试软件包
+1

看这里:http://stackoverflow.com/questions/11782030/sum-by-distinct-column-value-in-r – Pop 2012-08-03 14:45:20

回答

5

我觉得plyr包做到这一点最清楚的,但使用碱基R

dat <- structure(list(chrom = c("chr1", "chr1", "chr1", "chr1", "chr1", 
"chr1", "chr2", "chr2", "chr2", "chr3", "chr4"), exonCount = c(3L, 
4L, 5L, 5L, 9L, 10L, 7L, 11L, 13L, 7L, 7L)), .Names = c("chrom", 
"exonCount"), class = "data.frame", row.names = c(NA, -11L)) 

aggregate(data=dat, exonCount ~ chrom, FUN=sum) 

    chrom exonCount 
1 chr1  36 
2 chr2  31 
3 chr3   7 
4 chr4   7 
> 
4

df<-read.table(header=T,text="chrom exonCount 
chr1   3 
chr1   4 
chr1   5 
chr1   5 
chr1   9 
chr1  10 
chr2   7 
chr2  11 
chr2  13 
chr3   7 
chr4   7 
") 
library(plyr) 
ddply(df,.(chrom),summarise,sum(exonCount)) 
+0

你有一个额外的'('在你的解决方案。它必须是ddply(df,。(chrom),summary,sum(exonCount)) – 2012-08-03 14:50:24

2

使用ddply另一种方法是

ddply(df, .(chrom), numcolwise(sum)) 
    chrom exonCount 
1 chr1  36 
2 chr2  31 
3 chr3   7 
4 chr4   7 
1

这是这里最快的方法,但是比plyr功能或聚合(使用Justin的DAT)不太直观:

x <- data.frame(sort(unique(dat$chrom)), 
    unlist(lapply(split(dat$exonCount, dat$chrom), sum))) 
colnames(x) <- colnames(dat) 
rownames(x) <- NULL 
x 

这是第二快的方法这里:

x <- tapply(dat$exonCount, dat$chrom, sum) 
x <- data.frame(names(x), x) 
names(x) <- names(dat); rownames(x) <- NULL 
x 

的data.table包在基准测试中稍微慢一点,因为1)我搞乱了语法,或者2)它是为更大的问题而设计的,并没有揭示它是如何在这样的假数据集上有多好:

library(data.table) 
dat2 <- data.table(dat) 
dat2[,list(pop=sum(exonCount)), list(chrom)]