применить функцию подмножества к столбцам, используя другой набор данных со значениями min / max - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь применить функцию подмножества к каждому столбцу с минимальными и максимальными значениями из другого набора данных.

Минимальный воспроизводимый пример:

df <- mtcars

Мин. / Макс. Пределы двух столбцов:

dfLimits <- data.frame(Names = c("hp","wt"), Min = c(160,1.6), 
                       Max = c(220,NA),stringsAsFactors = F)`

Names   Min  Max
 hp     160   220
 wt     1.6   NA

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

df %>%  subset(hp < 220 & hp > 160 & wt > 1.6)`

1 Ответ

0 голосов
/ 27 марта 2020

Возможно, это не лучшее решение, но мы можем динамически создавать выражения и оценивать, используя eval(parse()). Мы заменяем NA значения на Inf / -Inf в Max / Min соответственно.

dfLimits$Max[is.na(dfLimits$Max)] <- Inf
dfLimits$Min[is.na(dfLimits$Min)] <- -Inf


subset(df, eval(parse(text = paste(dfLimits$Names, ">", dfLimits$Min, "&",
                      dfLimits$Names, "<", dfLimits$Max, collapse = " & "))))


#                    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
#Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
#Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
#Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
#Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
#Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
#Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6

, где результат paste:

paste(dfLimits$Names, ">", dfLimits$Min, "&", 
      dfLimits$Names, "<", dfLimits$Max, collapse = " & ")

#[1] "hp > 160 & hp < 220 & wt > 1.6 & wt < Inf"

Если вы заинтересованы в решении dplyr, мы можем использовать то же выражение paste в filter с parse_expr.

library(dplyr)
library(rlang)

df %>%
  filter(eval(parse_expr(paste(dfLimits$Names, ">", dfLimits$Min, "&",
              dfLimits$Names, "<", dfLimits$Max, collapse = " & "))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...