2012-08-03 72 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)]