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

我只希望输出为

chr1        36
chr2        31
chr3         7
chr4         7

我认为聚合函数可以做到这一点,但我在使用中迷失了方向。

谢谢

4

4 回答 4

5

我认为这个plyr包做的最清楚,但使用 base 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
> 
于 2012-08-03T14:47:42.793 回答
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))
于 2012-08-03T14:44:05.483 回答
2

另一种使用方法ddply

ddply(df, .(chrom), numcolwise(sum))
  chrom exonCount
1  chr1        36
2  chr2        31
3  chr3         7
4  chr4         7
于 2012-08-03T14:47:23.123 回答
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)]
于 2012-08-03T15:27:30.570 回答