gpt4 book ai didi

r - dplyr 中是否有 "unfilter"用于将更改与原始数据集合并?

转载 作者:行者123 更新时间:2023-12-03 14:43:00 25 4
gpt4 key购买 nike

假设我有两个 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”可以让我与原始数据集重新合并?

最佳答案

一种选择是使用 %in% 将“标志”创建为逻辑向量。通过比较“bad_ids”“id”列,然后按“id”分组,通过使用 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))

关于r - dplyr 中是否有 "unfilter"用于将更改与原始数据集合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58826488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com