【问题标题】:R: assign incremental numbers to rows containing a same label [duplicate]R:为包含相同标签的行分配增量编号[重复]
【发布时间】:2017-07-10 19:41:19
【问题描述】:

给定一个数据框df,如下:

chrom   position    strand  value   label
 chr1      17432         -      0   romeo
 chr1      17433         -      0   romeo
 chr1      17434         -      0   romeo
 chr1      17435         -      0   romeo
 chr1      17409         -      1  juliet
 chr1      17410         -      1  juliet
 chr1      17411         -      1  juliet

对于每组标签,我想从 1 开始对共享相同 label 的行进行编号,并将这些数字放入新列中。 (我不只是想数他们,目标是数他们)。输出应如下所示:

chrom   position    strand  value   label  number
 chr1      17432         -      0   romeo       1
 chr1      17433         -      0   romeo       2
 chr1      17434         -      0   romeo       3
 chr1      17435         -      0   romeo       4
 chr1      17409         -      1  juliet       1
 chr1      17410         -      1  juliet       2
 chr1      17411         -      1  juliet       3

是否有功能或包可以完成这项工作?

【问题讨论】:

  • 请不要使用数据框标签。对于 R,您需要 data.frame。

标签: r count numbers labels


【解决方案1】:
dat <- read.table(header = TRUE, text = "chrom   position    strand  value   label
chr1       17432    -           0   romeo
chr1       17433    -           0   romeo
chr1       17434    -           0   romeo
chr1       17435    -           0   romeo
chr1       17409    -           1   juliet
chr1       17410    -           1   juliet
chr1       17411    -           1   juliet")

#install.packages('dplyr')
library(dplyr)
dat %.%
  group_by(label) %.%
  mutate(number = 1:n())

Source: local data frame [7 x 6]
Groups: label

  chrom position strand value  label number
1  chr1    17432      -     0  romeo      1
2  chr1    17433      -     0  romeo      2
3  chr1    17434      -     0  romeo      3
4  chr1    17435      -     0  romeo      4
5  chr1    17409      -     1 juliet      1
6  chr1    17410      -     1 juliet      2
7  chr1    17411      -     1 juliet      3

我确信 R 中还有许多其他可能性。Data.Table 就是其中之一(参见下面的示例)。不知道为什么我需要添加 print() 来显示结果。

require(data.table)
dt <- data.table(dat)
print(dt[, number := 1:.N, by = label])

   chrom position strand value  label number
1:  chr1    17432      -     0  romeo      1
2:  chr1    17433      -     0  romeo      2
3:  chr1    17434      -     0  romeo      3
4:  chr1    17435      -     0  romeo      4
5:  chr1    17409      -     1 juliet      1
6:  chr1    17410      -     1 juliet      2
7:  chr1    17411      -     1 juliet      3

【讨论】:

  • 哇,它就像魔术一样工作!但我不知道如何将输出保存到新的dataframe...
  • 没关系,我想通了!只需要把整个东西放在()之间
【解决方案2】:

执行 Vincents 解决方案导致我出现错误:

找不到函数“%.%”

但是,将 %.% 更改为 %>% 对我来说是成功的:

library(dplyr)
dat %>%
    group_by(label) %>%
    mutate(number = 1:n())

注意,我使用的是 dplyr 版本 0.7.1

【讨论】:

    猜你喜欢
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2020-04-10
    相关资源
    最近更新 更多