排除后续重复的行

use*_*870 15 conditional duplicate-data r

我想排除所有重复的行.但是,只有当它们是后续行时才必须如此.遵循一个代表性的例子:

我的意见df:

    df <- "NAME   VALUE 
    Prb1  0.05
    Prb2  0.05
    Prb3  0.05
    Prb4  0.06
    Prb5  0.06
    Prb6  0.01
    Prb7  0.10
    Prb8  0.05"

df <- read.table(text=df, header=T)
Run Code Online (Sandbox Code Playgroud)

我的期望outdf:

outdf <- "NAME   VALUE 
Prb1  0.05
Prb4  0.06
Prb6  0.01
Prb7  0.10
Prb8  0.05"

outdf <- read.table(text=df, header=T)
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 14

rle()是一个很好的函数,可以识别相同值的运行,但将它的输出转换为可用的形式可能会很麻烦.这是一个相对无痛的咒语,适用于你的情况.

df[sequence(rle(df$VALUE)$lengths) == 1, ]
#   NAME VALUE
# 1 Prb1  0.05
# 4 Prb4  0.06
# 6 Prb6  0.01
# 7 Prb7  0.10
# 8 Prb8  0.05
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 10

可能有很多方法可以解决这个问题,我会尝试rleid/uniquedevel版本开始组合data.table

library(data.table) ## v >= 1.9.5
unique(setDT(df)[, indx := rleid(VALUE)], by = "indx")
#    NAME VALUE indx
# 1: Prb1  0.05    1
# 2: Prb4  0.06    2
# 3: Prb6  0.01    3
# 4: Prb7  0.10    4
# 5: Prb8  0.05    5
Run Code Online (Sandbox Code Playgroud)

或者从评论中提出一些很好的建议:

仅使用新shift功能

setDT(df)[VALUE != shift(VALUE, fill = TRUE)]
Run Code Online (Sandbox Code Playgroud)

或者duplicated结合使用rleid

setDT(df)[!duplicated(rleid(VALUE)), ]
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 8

这个怎么样:

> df[c(T, df[-nrow(df),-1] != df[-1,-1]), ]
  NAME VALUE
1 Prb1  0.05
4 Prb4  0.06
6 Prb6  0.01
7 Prb7  0.10
8 Prb8  0.05
Run Code Online (Sandbox Code Playgroud)

在这里,df[-nrow(df),-1] != df[-1,-1]查找包含不同值的连续行对,其余代码从数据帧中提取它们.