首页 > 解决方案 > 计算和分配变量的连续出现

问题描述

我希望计算任何值的连续出现并将该计数分配给下一列中的该值。以下是输入和所需输出的示例:

dataset <- data.frame(input = c("a","b","b","a","a","c","a","a","a","a","b","c"))
dataset$count <- c(1,2,2,2,2,1,4,4,4,4,1,1)

dataset  
   input   count
     a       1
     b       2
     b       2
     a       2
     a       2
     c       1
     a       4
     a       4
     a       4
     a       4
     b       1
     c       1

rle(dataset$input)可以得到每个值的出现次数。但我想要上述格式的结果输出。

我的问题类似于: R:计算单个列中连续出现的值 但是这里的输出是按顺序排列的,我想将计数本身分配给该值。

标签: rcountfind-occurrences

解决方案


您可以重复lengths参数lengths时间rle

with(rle(dataset$input), rep(lengths, lengths))
#[1] 1 2 2 2 2 1 4 4 4 4 1 1

使用dplyr,我们可以lag用来创建组,然后计算每个组中的行数。

library(dplyr)

dataset %>%
  group_by(gr = cumsum(input != lag(input, default = first(input)))) %>%
  mutate(count = n())

data.table

library(data.table)
setDT(dataset)[, count:= .N, rleid(input)]

数据

确保input列是字符而不是factor

dataset <- data.frame(input = c("a","b","b","a","a","c","a","a","a","a","b","c"),
           stringsAsFactors = FALSE)

推荐阅读