подмножество всех строк, кроме строк с определенным условием, с помощью group_by для различного числа переменных в r

#r #group-by #conditional-statements #subset

Вопрос:

Я хочу отфильтровать этот df

 Sample <- c(1:24)
Group <- c("A","A","A","A","A","A","A","A","A","A","A","A", "B","B","B","B","B","B","B","B","B","B","B","B")
T1 <- c(74.4, 74.7, 74.1, 72.2, 72.8, 72.9, 70.8, 71.2, 70.5, 72.4, 72.7, 72.1, 71.2, 71.8, 71.9, 70.8, 70.2, 70.5, 72.2, 72.7, 72.1, 70.8, 71.0, 70.7)
S1 <- c("sample", "sample", "sample", "std", "std","std","std","std", "std", "sample", "sample", "sample","sample", "sample", "sample", "std", "std","std", "std", "std", "sample", "sample", "sample", "sample")
df <- data.frame(Sample, Group, T1, S1)
 

сохранение всех строк, кроме тех, где
S1=="std" amp; Group == "A" amp; T1 %! -1% median(T1[S1 == "std"]) для каждого Group
, чтобы получить этот вывод

    Sample Group   T1     S1
1       1     A 74.4 sample
2       2     A 74.7 sample
3       3     A 74.1 sample
4       4     A 72.2    std
7       7     A 70.8    std
8       8     A 71.2    std
10     10     A 72.4 sample
11     11     A 72.7 sample
12     12     A 72.1 sample
13     13     B 71.2 sample
14     14     B 71.8 sample
15     15     B 71.9 sample
16     16     B 70.8    std
17     17     B 70.2    std
18     18     B 70.5    std
21     21     B 72.1 sample
22     22     B 70.8 sample
23     23     B 71.0 sample
24     24     B 70.7 sample
> 
 

Мне помогли с этим хорошим кодом

 df %>% group_by(Group) %>% filter(T1 % -1% median(T1[S1 == "std"]))
 

который фильтрует все строки (не только S1 == "std" ), но я не могу обойти его, чтобы реализовать subset функцию, чтобы удалить строки с этими условиями.

Я все еще делаю это так — что, насколько я понимаю, не является правильным способом, а также это не позволяет мне делать это для разного числа групп (если их более 2).

 for(Var in unique(df$Group)) {
    assign(paste("T1_", Var, sep = ""), median(filter(df, Group == Var, S1 == "std")$T1))
  }
`% -1%` <- function(T1, T1_A) (T1 >= T1_A-1) amp; (T1 <= T1_A 1)
df  %>% subset(!(df$S1=="std" amp; df$Group == "A" amp; df$T1 %! -1% T1_A | 
                 df$S1=="std" amp; df$Group == "B" amp; df$T1 %! -1% T1_B))
 

Ответ №1:

Это приведет к удалению строк в каждом Group , где S1=="std" и Group == "A" и T1 значение находится в пределах — 1% от median T1 где S1 == "std" .

 library(dplyr)

df %>%
  group_by(Group) %>%
  filter({
  val <- median(T1[S1 == "std"])     
  !(S1=="std" amp; T1 %! -1% val)
  }) %>% 
  ungroup
 

Комментарии:

1. спасибо за предложение, но это не дает точно такого же результата. Группа == «A», должна быть удалена, так как я хочу, чтобы фильтрация была для каждой группы. И также это -1, а не%, я думаю, что это сбивало с толку, потому что я не упоминал эту функцию (пожалуйста, посмотрите еще раз сообщение). Поэтому я заставил это работать так: df %>% group_by(Group) %>% filter({ val <- median(T1[S1 == "std"]) !(S1=="std" amp; T1 %! -1% val) }) %>% ungroup

2. Что такое ! -1 ? В каком пакете состоит эта функция?

3. эта функция у меня есть, пожалуйста, посмотрите мой оригинальный пост

4. возможно, вы также могли бы соответствующим образом скорректировать свой ответ, чтобы получить тот же результат, что и я — я думаю, это поможет, если кто-то захочет воспроизвести его, так как я мог бы добавить его только в качестве комментария

5. Это было добавлено после того, как я опубликовал ответ, поэтому мне было неясно, когда я писал ответ. Однако я рад, что вы смогли найти ответ. Я отредактировал ответ, чтобы включить его. Спасибо.