首页 > 解决方案 > 在r中选择以其他数据框列为条件的行

问题描述

我有一个这样的数据集

id <- rep(c("A", "B", "C", "D", "E"), 5)

year <- rep( c(2001 : 2005), each = 5)

status <- c(0, 0, 2, 0, 4, 0, 0, 3, 0, 1, 0, 4, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4 ) 

dt <- data.frame( year, id, status)

请注意,2003 年 Id BD Status > 0的 hare 和其他年份不是。我的目标是找到 2003 年的 Id 在所有其他年份的状态 > 1 和状态 = 0 的观察结果。如果一个 Id 全年都没有观察结果,我不会认为即使在此数据中所有 Id 全年都存在。

我做的是一个漫长的过程,而且没有效果-

id1 <- dt %>% filter(year == 2003 & status > 1)
id1 <- id1[["id"]]

dt1 <-   dt[dt$id %in% id1, ]


dt2 <- dt1 %>% filter(year != 2003) 

dt2<- dt2 %>% mutate( st2 = case_when( status == 1 ~ 0, TRUE ~ status)  )


dt2<- setDT(dt2)[, fact := +(uniqueN(st2) == 1), id]

dt2 <- dt2 %>% filter(fact == 1 ) %>% filter(st2 == 0)

id2 <- dt2[["id"]]

dt <- dt1[dt1$id %in% id2, ]

rm(id1, id2, dt1, dt2)

我认为这给了我想要的输出,但对重复性工作无效。我非常感谢您的帮助,以找到一种更好的方法来解决这个问题。

注意:我是 r 和编程的新手 - 对杂乱无章的问题表示歉意。

谢谢你的帮助!!!!

标签: rdplyrdata-manipulation

解决方案


如果我们要选择满足条件的Id

library(dplyr)
dt %>%
   group_by(Id) %>%
   filter(Status[Year == 2003]  > 1 & all(Status[Year != 2003] == 0))

推荐阅读