R Группировать по дате, чтобы получить частоту и использовать другой столбец для фильтрации. - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующий R dataframe.Я хотел бы получить частоту по дате, но используйте столбец Min, чтобы сохранить частоту 0, если она равна 0. Как мне это сделать?

Ниже приведен мой фрейм данных:

library(plyr)

df
  Location   Date            Min six endsix seven seventeen starteighteen eighteen

1 location_1 2018-11-21       0 360    415   420      1020          1025     1080
2 location_1 2018-11-22       0 360    415   420      1020          1025     1080
3 location_1 2018-11-23     131 360    415   420      1020          1025     1080
4 location_1 2018-11-24       0 360    415   420      1020          1025     1080
5 location_1 2018-11-25    1001 360    415   420      1020          1025     1080
6 location_1 2018-11-25     272 360    415   420      1020          1025     1080
7 location_1 2018-11-25    1319 360    415   420      1020          1025     1080

Если я сделаю следующее count(location_1, "Date") Я получу

   Date          freq
1  2018-11-21    1
2  2018-11-22    1
3  2018-11-23    1
4  2018-11-24    1
5  2018-11-25    5

Я бы хотел сделать это, но если в столбце Min есть 0, то для частоты, например, будет 0:

   Date          freq
1  2018-11-21    0
2  2018-11-22    0
3  2018-11-23    1
4  2018-11-24    0
5  2018-11-25    5

1 Ответ

0 голосов
/ 21 января 2019

С data.table:

# set seed for reproducibility
set.seed(1)

# data frame
df <- data.frame(Date = sample(seq(as.Date("2019-01-01"), as.Date("2019-01-09"), by = "days"), 30, replace = T), 
           Min = sample(c(0:5), 30, replace = T), stringsAsFactors = F)

# load packages
library(magrittr)
library(data.table)

# make df into data.table
setDT(df)

# establish which Date values have Min = 0
minVals <- df[Min == 0, unique(Date)]

# Count date and set those rows with Date Min = 0 to 0
res <- df[, .N, by = 'Date'][
  Date %in% minVals, N := 0
  ]

Результат:

> res
         Date N
1: 2019-01-03 0
2: 2019-01-04 0
3: 2019-01-06 0
4: 2019-01-09 5
5: 2019-01-02 5
6: 2019-01-01 2
7: 2019-01-07 0
8: 2019-01-05 1
9: 2019-01-08 1

Было бы неплохо, если бы вы опубликовали фрагмент своих данных таким образом, чтобы мы могли на самом деле проверить их при попытке дать ответ. Попробуйте dput(head(df, 10)), R отобразит на консоли вывод, который должен быть фрагментом кода, который создает фрагмент ваших фактических данных.

A dplyr решение:

library(dplyr)

count(df, Date) %>% 
  mutate(n = ifelse(Date %in% pull(filter(df, Min == 0), Date), 0, n))

В результате:

# A tibble: 9 x 2
  Date           n
  <date>     <dbl>
1 2019-01-01     2
2 2019-01-02     5
3 2019-01-03     0
4 2019-01-04     0
5 2019-01-05     1
6 2019-01-06     0
7 2019-01-07     0
8 2019-01-08     1
9 2019-01-09     5
...