我陷入了一件小事。我在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
我认为聚合功能可以做到这一点,但我在使用中迷失了。
由于
答案 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)]