首页 > 解决方案 > 设置开始计数的数字

问题描述

我想设置一个数字来开始计算行中的相同数据

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")

#set the starting count number for romeo
number = 2

#set the starting count number for romeo
juliet= 3

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

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())

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

标签: rdplyr

解决方案


我们可以创建一个数据框label及其起始值,以便它具有可扩展性并且可以容纳labels我们想要的任意数量。

lkup <- data.frame(label = c("romeo", "juliet"), number = c(2, 3))

然后我们可以加入两个数据框,获取起始值并将其添加到当前行号以获得新的number

library(dplyr)

dat %>%
   left_join(lkup, by = "label")  %>%
   group_by(label) %>%
   mutate(number = row_number() + number - 1)
   #Or same as OP's attempt
   #mutate(number = 1:n() + number - 1)

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

在基础 R 中,我们可以使用mergewithave使用相同的逻辑

dat$number <- with(merge(dat, lkup, by = "label", all.x = TRUE), 
              number + ave(number, label, FUN = seq_along) - 1)

推荐阅读