首页 > 解决方案 > R基于两列重置计数器

问题描述

我有以下类型的数据,我需要输出作为第二个数据框...

a <- c(1,1,1,1,2,2,2,2,2,2,2)
b <- c(1,1,1,2,3,3,3,3,4,5,6)
d <- c(1,2,3,4,1,2,3,4,5,6,7)


df <- as.data.frame(cbind(a,b,d))


output <- c(1,1,1,2,1,1,1,1,2,3,4)
df_output <- as.data.frame(cbind(df,output))

我已经尝试过 cumsum ,但我无法获得预期的结果。请指导。问候,恩图。


基于列 a 值变化,如果 b 要从一开始重置。

条件是如果 b 具有相同的值,它应该从 1 开始。

就像在第 5 条记录中一样,col b 的值为 3。它应该重置为 1,如果 col b 相同的所有值(如 ro 6,6,7,8 的情况相同,那么它应该是 1 并且任何更改都应增加 1)。

标签: r

解决方案


我们可以按列“a”进行分组,然后使用“b”中match的值创建新列unique

library(dplyr)
df2 <- df %>%
          group_by(a) %>%
          mutate(out = match(b, unique(b))) 

df2
# A tibble: 11 x 4
# Groups:   a [2]
#       a     b     d   out
#   <dbl> <dbl> <dbl> <int>
# 1     1     1     1     1
# 2     1     1     2     1
# 3     1     1     3     1
# 4     1     2     4     2
# 5     2     3     1     1
# 6     2     3     2     1
# 7     2     3     3     1
# 8     2     3     4     1
# 9     2     4     5     2
#10     2     5     6     3
#11     2     6     7     4

或者另一种选择是强制factor变量integer

df %>%
    group_by(a) %>%
    mutate(out = as.integer(factor(b))) 

数据

df <- data.frame(a, b, d)

推荐阅读