考虑此表
var1 var2 var3
565 P0049129/21 146
565 P0020151/04 146
我想遍历此表,找到var3等于相同值的连续行(在此示例中为146),然后删除其中的一行。
请注意,在此表中还有var3 = 146的其他行,我想保留这些行。当两个连续的行上的var3具有相同的值时,我只想删除重复项。
谢谢
答案 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))