通过列[R]中重复出现的元素折叠数据框

时间:2012-08-03 14:41:24

标签: r dataframe aggregate

我陷入了一件小事。我在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

我只想输出

chr1        36
chr2        31
chr3         7
chr4         7

我认为聚合功能可以做到这一点,但我在使用中迷失了。

由于

4 个答案:

答案 0 :(得分: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
> 

答案 1 :(得分:4)

如果你想使用plyr包试试:

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))

答案 2 :(得分:2)

使用ddply的另一种方法是

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

答案 3 :(得分: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)]