Как исключить 0 при поиске максимальных и минимальных значений? - PullRequest
1 голос
/ 28 марта 2019

У меня есть датафрейм с некоторыми ценовыми значениями.Нет, я хочу иметь один или, в лучшем случае, два фрейма данных со значениями max и min для каждой статьи без значений 0.

Я пробовал это так с DT (для maxValue все работает идеально):

minValue <- setDT(df)[, .SD[which.min(price > 0)], by=number]
maxValue <- setDT(df)[, .SD[which.max(price)], by=number]

Но minValue Df показывает 0 значений.Я также пробовал это с:

do.call(rbind, tapply(df$price, df$number, FUN = function(x) c(max = max(x), min = min(x))))

Но здесь я не знаю, как использовать условие> 0.

В лучшем случае я хотел бы иметь dfs maxvalue и minvalue длякаждый продукт.

Ответы [ 3 ]

3 голосов
/ 28 марта 2019

Вы можете использовать dplyr, например:

library(dplyr)
df %>%
  group_by(number) %>%
  filter(price != 0) %>%
  summarise(minPrice = min(price),
            maxPrice = max(price))
2 голосов
/ 28 марта 2019

Используя base R

f1 <- function(x) c(minPrice = min(x), maxPrice = max(x))
aggregate(price ~ number, FUN = f1, df, subset = price != 0))

Или с by

do.call(rbind, by(df, df$number, FUN = f1))

data

df <- data.frame(number = c(1, 1, 1, 2, 2, 3, 3, 3), 
         price = c(0, 3, 2, 4, 3, 1, 2, 0))
2 голосов
/ 28 марта 2019

Это работает?

  minValue <- setDT(df)[price!=0, .(MinPrice=min(price)), by=number]
  maxValue <- setDT(df)[price!=0, .(MaxPrice=max(price)), by=number]
...