【问题标题】:How do I use plyr to number rows?如何使用 plyr 对行进行编号?
【发布时间】:2010-02-02 20:29:42
【问题描述】:

基本上我想要一个基于我的同类群组的自动递增 id 列 - 在本例中是 .(kmer, cvCut)

    > myDataFrame
       size kmer cvCut   cumsum
1      8132   23    10     8132
10000   778   23    10 13789274
30000   324   23    10 23658740
50000   182   23    10 28534840
100000   65   23    10 33943283
200000   25   23    10 37954383
250000  584   23    12 16546507
300000  110   23    12 29435303
400000   28   23    12 34697860
600000  127   23     2 47124443
600001  127   23     2 47124570

我想要添加一个基于 kmer/cvCut 组具有新行名称的列

    > myDataFrame
       size kmer cvCut   cumsum  newID
1      8132   23    10     8132      1
10000   778   23    10 13789274      2
30000   324   23    10 23658740      3
50000   182   23    10 28534840      4
100000   65   23    10 33943283      5 
200000   25   23    10 37954383      6
250000  584   23    12 16546507      1
300000  110   23    12 29435303      2
400000   28   23    12 34697860      3
600000  127   23     2 47124443      1
600001  127   23     2 47124570      2

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    我会这样做:

    library(plyr)
    ddply(df, c("kmer", "cvCut"), transform, newID = seq_along(kmer))
    

    【讨论】:

      【解决方案2】:

      每次 plyr 呼叫您时只需添加一个新列:

      R> DF <- data.frame(kmer=sample(1:3, 50, replace=TRUE), \
                          cvCut=sample(LETTERS[1:3], 50, replace=TRUE))
      R> library(plyr)
      R> ddply(DF, .(kmer, cvCut), function(X) data.frame(X, newId=1:nrow(X)))
         kmer cvCut newId
      1     1     A     1
      2     1     A     2
      3     1     A     3
      4     1     A     4
      5     1     A     5
      6     1     A     6
      7     1     A     7
      8     1     A     8
      9     1     A     9
      10    1     A    10
      11    1     A    11
      12    1     B     1
      13    1     B     2
      14    1     B     3
      15    1     B     4
      16    1     B     5
      17    1     B     6
      18    1     C     1
      19    1     C     2
      20    1     C     3
      21    2     A     1
      22    2     A     2
      23    2     A     3
      24    2     A     4
      25    2     A     5
      26    2     B     1
      27    2     B     2
      28    2     B     3
      29    2     B     4
      30    2     B     5
      31    2     B     6
      32    2     B     7
      33    2     C     1
      34    2     C     2
      35    2     C     3
      36    2     C     4
      37    3     A     1
      38    3     A     2
      39    3     A     3
      40    3     A     4
      41    3     B     1
      42    3     B     2
      43    3     B     3
      44    3     B     4
      45    3     C     1
      46    3     C     2
      47    3     C     3
      48    3     C     4
      49    3     C     5
      50    3     C     6
      R> 
      

      【讨论】:

      • 这是一种虚拟联系,尤其是因为我们的解决方案非常相似。起初我有你的,但不喜欢将添加列的名称返回到 data.frame() 代替 cbind() ;-)
      【解决方案3】:

      我认为这就是你想要的:

      加载数据:

      x <- read.table(textConnection(
      "id      size kmer cvCut   cumsum
      1      8132   23    10     8132
      10000   778   23    10 13789274
      30000   324   23    10 23658740
      50000   182   23    10 28534840
      100000   65   23    10 33943283
      200000   25   23    10 37954383
      250000  584   23    12 16546507
      300000  110   23    12 29435303
      400000   28   23    12 34697860
      600000  127   23     2 47124443
      600001  127   23     2 47124570"), header=TRUE)
      

      使用 ddply:

      library(plyr)
      ddply(x, .(kmer, cvCut), function(x) cbind(x, 1:nrow(x)))
      

      【讨论】:

      • 使用data.frame(),我们也可以设置所需的列标签newId :)
      • 非常正确。但我确实使用了提供的数据。 :)
      猜你喜欢
      • 2014-05-28
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      相关资源
      最近更新 更多