删除具有相等和连续值的行

时间:2019-09-05 14:30:14

标签: r dplyr data.table

考虑此表

var1    var2        var3
565 P0049129/21     146
565 P0020151/04     146

我想遍历此表,找到var3等于相同值的连续行(在此示例中为146),然后删除其中的一行。

请注意,在此表中还有var3 = 146的其他行,我想保留这些行。当两个连续的行上的var3具有相同的值时,我只想删除重复项。

谢谢

3 个答案:

答案 0 :(得分:2)

library(data.table)
setDT(df)

df[rowid(rleid(var3)) == 1]

答案 1 :(得分:2)

我们可以先使用 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); ,然后再使用rleid

duplicated

这将仅保留连续值的第一行,并删除其余值。

答案 2 :(得分:1)

我们可以使用SELECT Avg(dt.max_diff) AS LifetimeAVG FROM (SELECT u.user_id, Timestampdiff (day, u.reg_ts, Max(a.actvy_ts)) AS max_diff FROM activity AS a JOIN users AS u ON u.user_id = a.user_id GROUP BY u.user_id, u.reg_ts HAVING max_diff >= 90) AS dt 查找相同的组

rleid

或者另一个选择是

library(data.table)
i1 <- setDT(df1)[,  .I[1],rleid(var3)]$V1
df1[i1]
#     var1        var2 var3
#@1:  565 P0049129/21  146

或者我们可以在其中进行。library(dplyr) df1 %>% group_by(grp = cumsum(var3 != lag(var3, default = first(var3)))) %>% slice(1) %>% ungroup %>% select(-grp) # A tibble: 1 x 3 # var1 var2 var3 # <int> <chr> <int> #1 565 P0049129/21 146

base R

数据

grp <- with(rle(df$var3), rep(seq_along(values), lengths))
subset(df, !duplicated(grp))