unique()但仅在连续的行上

时间:2019-11-13 18:45:40

标签: r

我正在寻找unique()的等价物,但仅在连续的行上完成。即在以下示例中:

df <- data.frame(a = rep(c(1:3,1:3), each = 3), b = rep(c(4:6,4:6), each = 3))
unique(df)
#  a b
#1 1 4
#4 2 5
#7 3 6

我想得到:

function_I_am_looking_for(df)
#   a b
#1  1 4
#4  2 5
#7  3 6
#10 1 4
#13 2 5
#16 3 6

1 个答案:

答案 0 :(得分:4)

我们可以使用rleid创建分组变量,并使用slice第一行

library(dplyr)
library(data.table)
df %>% 
   group_by(grp = rleid(a, b)) %>%
   slice(1) %>%
   ungroup %>%
   select(-grp)
# A tibble: 6 x 2
#      a     b
#  <int> <int>
#1     1     4
#2     2     5
#3     3     6
#4     1     4
#5     2     5
#6     3     6

data.table语法相同(由'a',b'的rleid分组),提取第一个元素行索引(.I)并以此子集进行行

setDT(df)[df[, .I[1], .(rleid(a, b))]$V1]

或将uniqueby一起使用

unique(setDT(df)[, grp := rleid(a, b)], by = "grp")

或者, OP首选版本,仅使用基本功能的通用data.frame解决方案:

unique(cbind(rleidv(df), df))[,-1]