比方说,我有两个像这样的data.frames:
bad_ids = read.table(text="id n
123 3", header = T)
dat <- read.table(text="id n partner_id
123 3 555
123 3 345
123 3 092
245 1 438
888 1 333", header=T)
我想标识dat
中与bad_ids.
中id列匹配的所有行,然后我想创建一个“标志”变量,该变量对于除第一个匹配项之外的所有匹配项都设置为1。最终的data.frame看起来像:
dat <- read.table(text="id n partner_id flag
123 3 555 0
123 3 345 1
123 3 092 1
245 1 438 0
888 1 333 0", header=T)
请注意,123
的第一行的标记为0
。我要标记除第一场比赛以外的所有比赛。
我模仿这种行为的策略如下:
# Flag the Duplicate Rows
dat %>%
filter(id %in% bad_ids$id) %>%
slice(-1) %>% # delete the first row
mutate(flag = 1) #create the id on all but the first match %>%
unfilter() # this is the function I want to go back to the original, unfiltered dataset
我想知道是否有某种等同的“ unfilter”可以让我重新合并原始数据集?
答案 0 :(得分:2)
一个选项是通过比较'bad_ids''id'列,然后通过'id'分组,通过创建另一个条件来更改'flag',从而通过%in%
将'flag'作为逻辑向量创建row_number()
library(dplyr)
dat %>%
mutate(flag = id %in% bad_ids$id) %>%
group_by(id) %>%
mutate(flag = +(row_number() > 1 & flag))
#or use `duplicated`
# mutate(flag = +(duplicated(flag) & flag))
# A tibble: 5 x 4
# Groups: id [3]
# id n partner_id flag
# <int> <int> <int> <int>
#1 123 3 555 0
#2 123 3 345 1
#3 123 3 92 1
#4 245 1 438 0
#5 888 1 333 0
此外,如果我们使用OP代码中的方法,则可以选择加入NA
并将其替换为0
dat %>%
filter(id %in% bad_ids$id) %>%
slice(-1) %>%
mutate(flag = 1) %>%
right_join(dat) %>%
mutate(flag = replace_na(flag, 0))