我正在尝试使用dplyr执行简单的过滤,但是它似乎无法满足我的要求。
仅当时间与category
匹配,然后查看列Value
时,我才想基于时间过滤数据帧。
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。
谢谢!
答案 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
!