根据另一列中的匹配条件过滤列

时间:2020-02-12 13:38:14

标签: r filter dplyr

我正在尝试使用dplyr执行简单的过滤,但是它似乎无法满足我的要求。

仅当时间与category匹配,然后查看列Value时,我才想基于时间过滤数据帧。

enter image description here

df <- read.table(header = TRUE, text = "SubjectID Treatment Time Value
                A1 Amutant T0 5.3
                B0 Control T0 4.8
                A3 Amutant T3 4
                B1 Control T1 3
                B3 Control T3 6.5
                C2 Bmutant T2 2
                C1 Bmutant T1 3")

df %>% 
  group_by (Time) %>% 
  filter (Time == "T0") %>%
  filter (Value <5)

这似乎不是我真正想要得到的,因为我想将与T0<5匹配的那些行的整个行子集化。

结果应该仅过滤那些T0高于5的受试者,但不应影响T1,T2,T3。

谢谢!

3 个答案:

答案 0 :(得分:2)

如果我对您的理解正确,则可以使用子集功能

subset(df, Time == "T0" & Value < 5 | Time != "T0")

dplyr

df %>% filter(Time == "T0" & Value < 5 | Time != "T0")

答案 1 :(得分:1)

创建一个可以过滤的帮助者字段最简单

library(dplyr)

df %>%
  mutate(isFilter = case_when(Time == "T0" & Value > 5 ~ 1, TRUE ~ 0)) %>%
  filter(isFilter == 0)

SubjectID Treatment Time Value isFilter
1        B0   Control   T0   4.8        0
2        A3   Amutant   T3   4.0        0
3        B1   Control   T1   3.0        0
4        B3   Control   T3   6.5        0
5        C2   Bmutant   T2   2.0        0
6        C1   Bmutant   T1   3.0        0

答案 2 :(得分:0)

我认为这会起作用。

dates <- rep(
  seq(as.numeric(as.Date("01-01-2020", format = "%d-%m-%Y")),
      as.numeric(as.Date("01-10-2020", format = "%d-%m-%Y"))), 
  each = 24
)

value <- runif(length(dates), 1, 10)
time <- runif(length(dates), 0, 1) 

data <- cbind(dates, value, time)
data <- tibble::as_tibble(data)

out <- data %>% filter(value != 0 & time > 5)
isTRUE(sum(out$time < 5 | out$value == 0) == 0)
#[1] TRUE