unique()但仅在连续的行上

问题描述 投票:2回答:1

我正在寻找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
r
1个回答
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]

或与unique一起使用by

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

或者,OP首选版本

,仅使用基本功能的通用data.frame解决方案:
unique(cbind(rleidv(df), df))[,-1]
© www.soinside.com 2019 - 2024. All rights reserved.