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

Вот некоторые примеры данных:

MinimumPrice    MaximumPrice    ActualPrice
30.5               41                51
95.5              100                92
45.5              50                 43
70                75                 80

Я пытался использовать:

TBAcomparison$withinRange_Price<- ifelse(sapply(Prices$ActualPrice, function(p) 
  any(Prices$MaximumPrice <= p & Prices$MinimumPrice>= p)),1, NA)

Хотя, это не совсем то, что я ищу.

Результат должен быть:

MinimumPrice    MaximumPrice    ActualPrice      WithinRange
30.5               41                51             1
95.5              100                92             NA
42.5              50                 43             1
70                75                 80             NA

Любой, кто сможет помочь, будет очень признателен.

Dput :

structure(list(MinimumPrice = c(30.5, 95.5, 45.5, 70), MaximumPrice = c(41, 
100, 50, 75), ActualPrice = c(51, 92, 43, 80), withinrange = c("No", 
"No", "No", "No")), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame"))
1
QMan5 27 Апр 2020 в 19:18

2 ответа

Лучший ответ

Опция с dplyr

library(dplyr)
Prices %>%
   mutate(withinRange_Price = case_when(ActualPrice > MinimumPrice & 
             ActualPrice <= MaximumPrice ~ 1))
1
akrun 27 Апр 2020 в 17:47

< и > векторизованы, поэтому вы слишком усложняете, используя sapply. Попробуй это:

Prices$withinRange_Price <- with(Prices, ifelse(MinimumPrice <= AcutalPrice & ActualPrice <= MaximumPrice, 1, NA))

Я немного озадачен тем, что ваш код, похоже, использует 2 фрейма данных, но ваши текстовые и примерные данные указывают только на 1 фрейм данных, но я оставлю это вам.

2
Gregor Thomas 27 Апр 2020 в 16:21