Подмножество строк в фрейме данных по крайней мере с двумя из нескольких условий

На этот вопрос уже дан ответ по этой ссылке (подмножество по крайней мере двумя из нескольких условий), однако у меня есть дополнительный запрос. Ниже приведен мой фрейм данных (df)

a   b   c   d1  d2  e   z
3.2 0.6 5.8 143.7   95.0    2.9 2
3.3 1.3 5.3 137.3   73.3    1.0 1
2.8 1.3 5.6 135.3   79.3    1.8 2
2.9 1.4 5.3 137.7   82.0    1.9 2
4.7 1.8 5.5 143.0   86.5    1.5 1
3.2 1.4 5.8 125.3   79.0    1.5 2
2.6 1.8 5.8 137.3   79.0    1.0 1
3.4 1.4 5.1 132.0   72.3    1.0 1
3.5 1.8 5.0 130.7   75.7    2.0 2
2.1 1.2 4.6 108.3   70.7    1.5 2
3.8 1.7 5.1 133.5   79.8    1.8 2
3.3 1.3 5.1 121.7   79.7    1.5 2
5.2 1.5 5.2 144.7   88.3    1.5 2
4.8 1.2 5.3 127.7   78.0    1.8 2
2.8 0.6 5.4 116.7   61.7    2.0 2
3.7 1.4 4.7 101.0   63.3    1.6 2
2.9 1.4 5.0 121.3   76.3    1.5 2
2.2 1.5 5.3 144.3   83.7    1.6 2
4.4 0.8 5.1 140.0   84.7    1.4 2
5.0 2.4 5.5 124.3   83.0    1.6 2
1.9 0.9 5.4 143.0   79.7    1.1 1
4.5 1.7 5.8 143.7   91.7    0.9 1
3.3 0.7 5.1 127.3   69.3    2.2 2
3.4 1.3 5.6 161.0   87.7    1.7 2
4.5 1.8 6.1 139.7   75.3    1.2 1
3.9 0.8 5.2 99.3    61.0    1.2 2
2.6 2.4 4.8 127.0   79.3    1.8 2
3.4 0.9 5.3 130.0   79.0    1.0 1
2.7 0.4 4.8 135.0   83.7    1.0 2
2.9 1.9 4.7 132.7   90.3    1.5 2
3.9 1.1 6.5 126.3   68.0    1.3 2
3.1 0.9 5.9 152.0   98.3    1.3 1
4.6 1.7 6.0 144.0   96.3    1.5 1
4.1 4.8 5.1 132.7   70.3    0.8 1
5.9 1.2 5.6 130.3   79.0    1.4 2
3.9 2.9 5.3 128.0   76.3    0.7 1
3.2 1.3 5.9 151.7   88.7    1.4 2
3.7 4.0 6.4 133.0   82.7    1.2 2
3.1 1.4 6.6 124.7   76.0    1.0 1
2.9 0.6 5.4 121.0   74.0    2.1 2
3.4 4.1 5.1 137.3   69.0    0.8 1
3.4 2.7 4.9 136.3   78.3    1.4 1
4.0 0.9 4.8 123.0   71.0    2.1 2
2.5 0.8 4.5 175.3   107.8   1.7 1
5.0 2.2 5.2 151.7   78.7    1.3 1
3.9 6.4 5.6 128.7   85.3    0.6 1
3.4 1.5 5.7 131.0   81.0    1.5 1
3.7 0.9 5.3 104.7   67.0    0.9 2
2.3 1.8 5.8 126.3   78.7    1.0 1
5.0 1.3 5.5 134.7   85.7    1.2 1
3.2 1.9 6.1 130.7   77.7    0.9 2
3.8 1.8 5.8 123.0   75.0    1.4 1
3.6 2.1 5.0 135.3   87.0    1.3 1
3.7 3.5 6.0 145.8   80.3    1.4 1
3.2 0.6 4.7 114.0   71.0    1.9 2
3.9 1.5 5.3 129.7   87.0    1.2 1
4.3 1.4 4.9 105.0   67.7    1.2 2
4.2 2.7 6.3 122.0   76.7    1.2 2
4.8 2.9 5.6 131.0   76.3    1.1 1
2.5 2.2 5.4 115.3   70.7    1.3 1
2.5 1.4 5.1 148.3   93.3    2.4 2
3.7 0.8 4.7 117.3   77.7    1.2 2
4.0 2.7 6.2 127.3   79.3    1.1 2
2.6 1.2 5.6 155.3   109.7   1.5 1
3.3 2.1 5.1 118.7   72.3    1.4 2
4.2 0.8 5.4 126.0   73.7    2.0 2
4.0 1.6 5.3 153.0   86.7    1.4 2
3.8 1.2 6.7 154.3   84.0    1.6 2
3.2 1.8 5.4 168.7   87.7    1.2 1
3.2 1.3 5.2 135.0   74.3    1.2 1
3.5 1.2 5.9 138.3   75.3    1.4 1
3.6 1.4 5.1 126.7   81.0    1.1 2
3.3 1.7 6.4 152.3   87.7    1.5 1
2.6 0.7 5.6 134.3   74.7    2.2 2
4.1 1.8 5.8 154.8   83.0    1.7 2
2.5 1.0 4.6 147.7   93.0    1.2 1
4.0 1.7 5.9 132.3   80.7    1.3 1
3.2 1.5 6.1 144.3   85.0    1.3 1
2.8 1.6 4.7 115.3   81.0    1.4 2
3.4 1.0 6.0 130.8   80.3    1.2 1
2.9 1.3 5.5 132.7   82.3    1.5 2
4.0 1.9 5.9 114.0   67.7    1.7 2
4.1 1.3 5.3 129.7   77.0    1.4 2
1.9 1.1 6.1 124.3   58.0    1.5 2
3.0 1.2 5.0 129.3   81.7    1.6 2
4.1 0.9 5.0 129.7   80.3    1.5 1
3.2 2.8 5.5 127.3   72.8    1.0 1
3.2 1.0 4.6 135.7   80.0    2.8 2
3.0 1.7 5.7 154.3   88.3    1.4 2
3.2 3.1 6.2 129.3   76.7    1.2 1

Я хочу подмножить это таким образом, чтобы выполнялись как минимум 2 из следующих 5 условий:

a  >= 4.11
b  >= 2.26
c  >= 5.6
d1 <= 140 and/or d2 <= 90 (considering both these variables d1 and/or d2 as one condition)
e  <= 1.03 mmol/L (when z == 1) and e  <= 1.29 mmol/L (when z == 2)

Я понимаю, как добавить первые 3 в следующий код, но может ли кто-нибудь помочь мне с тем, как добавить последние 2 условия?

df_new <- df[rowSums(cbind(df$a >= 4.11, df$b >= 2.26, df$c >= 5.6)) > 1,]

Заранее спасибо.


person Letin    schedule 16.09.2019    source источник
comment
Пробовали ли вы функцию подмножества rdocumentation.org/packages/base/versions /3.6.1/темы/подмножество   -  person Casper    schedule 16.09.2019
comment
Привет, Каспер, спасибо, что предложил это. Я смотрю.   -  person Letin    schedule 16.09.2019
comment
подмножество ‹- подмножество (данные, (a ›= 3,0 | b ›= 1,3 | c ›= 5,0 | d1 ‹= 140 | e ‹= 1,3)) это то, что вы хотите? альтернативное решение, подмножество ‹- данные [которые(данные$a ›= 3,0 | данные$b ›= 1,3 | данные$c ›= 5,0 | данные$d1 ‹= 140 | данные$e ‹= 1,3), ]   -  person Casper    schedule 16.09.2019
comment
попробуй: df[rowSums(cbind(df$a >= 4.11, df$b >= 2.26, df$c >= 5.6, df$d1 <= 140 | df$d2 <= 90, (df$e <= 1.03 & df$z==1) | (df$e <= 1.29 & df$z==2) )) > 1,]   -  person GKi    schedule 16.09.2019
comment
Условие 4: (df$d1 <= 140 | df$d2 <= 90); условие 5: (df$e <= 1.03 && df$z == 1). Вы можете просто добавить их в свой cbind, и он должен дать вам то, что вы ищете. В этом конкретном случае, когда выполняются как минимум 2 условия, subset, filter и filter_if не будут очень полезны.   -  person Oliver    schedule 16.09.2019
comment
Спасибо всем за ваш вклад. Ответ от @GKi сработал отлично.   -  person Letin    schedule 16.09.2019


Ответы (1)


Комбинируя filter с filter_if из пакета dplyr, вы можете фильтровать (подмножествовать) свои данные на основе ваших условий.

  library(dplyr)

as_data_frame(df) -> df

  # commas represent AND statements
  df %>% 
    filter(
      a  >= 4.11,
      b  >= 2.26,
      c  >= 5.6,
      d1 <=140,
      d2 <= 90
    ) %>% 
    filter_if(
      z == 1 & e <= 1.29, e <=1.03 # conditional filering
    )->df_new
person R 2 minutes tutorials    schedule 16.09.2019
comment
Спасибо @R2 за ваши усилия. Это дало мне ошибку: Ошибка в tbl_if_vars(.tbl, .p, .env,..., .include_group_vars = .include_group_vars): length(.p) == length(tibble_vars) не является TRUE, но приведенный выше ответ от GKi сработало для меня. - person Letin; 16.09.2019