как найти минимальные значения в разные даты в г - PullRequest
2 голосов
/ 30 сентября 2019

У меня есть данные для фрейма данных

Date          Marks
21-01-2019     18
22-01-2019     12
23-01-2019     14 
24-01-2019     20
25-01-2019     16
19-02-2019     12
20-02-2019     11
21-02-2019     18
22-02-2019     15 
23-02-2019     20
24-02-2019     14

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

Date          Marks
22-01-2019     12
20-02-2019     11

Ответы [ 3 ]

3 голосов
/ 30 сентября 2019

Поскольку вы знаете фиксированный формат даты, вы можете просто отрезать часть дня и группу по ним. Вы можете group_by, чтобы добавить минимальные отметки для каждой строки, группируя по году / месяцу, а затем отфильтруйте все строки, которые не были равны минимальному.

table %>%
  mutate(ym = substring(Date, 4)) %>%
  group_by(ym) %>%
  mutate(min_marks = min(Marks)) %>%
  ungroup() %>%
  filter(Marks == min_marks) %>%
  select(-ym, -min_marks)

Отредактировано для учета поискадней с минимальными оценками. Обратите внимание, что это может привести к появлению нескольких строк, если имеется несколько дат с одинаковыми минимальными отметками.

2 голосов
/ 30 сентября 2019

Чтобы получить минимум за месяцы и годы, вы можете сделать (это включает dplyr):

df %>%
 group_by(Date = format(as.Date(Date, format = "%d-%m-%Y"), "%m-%Y")) %>%
 summarise_all(min)

  Date    Marks
  <chr>   <int>
1 01-2019    12
2 02-2019    11

И то же самое с base R:

aggregate(Marks ~ cbind(Date = format(as.Date(Date, format = "%d-%m-%Y"), "%m-%Y")), 
          FUN = min, 
          data = df)

ЕслиВы хотите вернуть также соответствующую дату:

df %>%
 group_by(month_year = format(as.Date(Date, format = "%d-%m-%Y"), "%m-%Y")) %>%
 slice(which.min(Marks)) %>%
 ungroup() %>%
 select(-month_year)

  Date       Marks
  <chr>      <int>
1 22-01-2019    12
2 20-02-2019    11

И то же самое с base R:

df[df$Marks == with(df, ave(Marks, format(as.Date(Date, format = "%d-%m-%Y"), "%m-%Y"), 
                            FUN = function(x) x[which.min(x)])), ]
0 голосов
/ 30 сентября 2019

data.table + lubridate пример:

Данные

dt = data.table(
  Date = seq(as.Date('2001-01-27'), as.Date('2001-02-03'), 1),
  Marks = rnorm(8)
)

> dt
         Date       Marks
1: 2001-01-27 -1.43603728
2: 2001-01-28 -1.02685408
3: 2001-01-29  0.37307426
4: 2001-01-30 -0.79033901
5: 2001-01-31  0.05463855
6: 2001-02-01  1.62495320
7: 2001-02-02 -0.44335638
8: 2001-02-03 -0.66227100

Код

dtsum = dt[, .(Date = Date[which.min(Marks)], MinMark = min(Marks)), .(Month = month(Date))][, 2:3]

> dtsum
         Date   MinMark
1: 2001-01-27 -1.436037
2: 2001-02-03 -0.662271
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...