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/unique从devel版本开始组合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)
这个怎么样:
> 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]查找包含不同值的连续行对,其余代码从数据帧中提取它们.
| 归档时间: |
|
| 查看次数: |
367 次 |
| 最近记录: |