【问题标题】:collapsing a data frame by recurring elements in column [R]通过列 [R] 中的重复元素折叠数据框
【发布时间】:2012-08-03 14:41:23
【问题描述】:

我被一件小事困住了。我在 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

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

谢谢

【问题讨论】:

标签: r dataframe aggregate


【解决方案1】:

我认为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
> 

【讨论】:

    【解决方案2】:

    如果你想使用 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))
    

    【讨论】:

    • 你的解决方案中有一个额外的 '('。它必须是 ddply(df,.(chrom),summarise,sum(exonCount))
    【解决方案3】:

    使用ddply 的另一种方法是

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

    【讨论】:

      【解决方案4】:

      这是最快的方法,但不如 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)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        • 2013-06-20
        • 1970-01-01
        • 1970-01-01
        • 2020-11-12
        相关资源
        最近更新 更多