我有一个看起来像这样的data.frame df
ID VALUE_1 VALUE_2 VALUE_3
Pete 55 52 53
Amber 23 33 47
Amber 47 25 69
Bob 34 25 52
Bob 52 78 93
Bob 93 11 83
Alfie 24 75 52
Alfie 13 64 32
我有兴趣对子集进行保留,仅保留名称方面的重复项,并且如果VALUE_3
与后续的VALUE_1
是相等/重复项,并产生结果输出:
ID VALUE_1 VALUE_2 VALUE_3
Amber 23 33 47
Amber 47 25 69
Bob 34 25 52
Bob 52 78 93
Bob 93 11 83
任何帮助将不胜感激!
答案 0 :(得分:3)
这里是使用tidyverse
的想法。我们按ID
分组,仅删除1个观察值即可删除所有组。然后,我们创建一个逻辑列,其values_3与下一个value_1相等。然后,我们使用fill
填充语句,并使用该变量进行过滤
library(tidyverse)
df %>%
group_by(ID) %>%
filter(n() > 1) %>%
mutate(new = VALUE_3 == lead(VALUE_1)) %>%
fill(new) %>%
filter(new) %>%
ungroup() %>%
select(-new)
给出,
# A tibble: 5 x 4 ID VALUE_1 VALUE_2 VALUE_3 <fct> <int> <int> <int> 1 Amber 23 33 47 2 Amber 47 25 69 3 Bob 34 25 52 4 Bob 52 78 93 5 Bob 93 11 83
实现上述目的的两种data.table
方法(@akrun和@Frank的补充)
library(data.table)
setDT(df)[, .SD[cummax(.N >1 & VALUE_3 == shift(VALUE_1, type = 'lead', fill = last(VALUE_1))) > 0], ID] -- #akrun
w = DF[VALUE_1 == shift(VALUE_3) & ID == shift(ID), which = TRUE]
DF[unique(sort(c(w, w-1)))] -- #Frank