Фильтрация столбца по условиям сопоставления в другом столбце - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь выполнить простую фильтрацию с использованием 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 ]

2 голосов
/ 12 февраля 2020

Если я вас правильно понимаю Вы можете использовать функцию подмножества

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

dplyr

df %>% filter(Time == "T0" & Value < 5 | Time != "T0")
1 голос
/ 12 февраля 2020

Может быть проще всего создать вспомогательное поле, которое можно фильтровать по

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
0 голосов
/ 12 февраля 2020

Я думаю, что это будет работать.

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

!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...