Реорганизация данных по дате и подсчет в г - PullRequest
0 голосов
/ 02 мая 2018

У меня есть данные, которые выглядят следующим образом:

> head(z, 10)
         date year      long      lat
1  01/18/2017 2017 -92.48474 29.76465
2  01/22/2017 2017 -93.11126 29.83961
3  12/28/2013 2013 -91.30789 29.41938
4  01/08/2014 2014 -93.09949 29.80632
5  01/03/2014 2014 -90.55703 29.44535
6  12/31/2013 2013 -90.39836 29.57244
7             2013 -93.56322 30.30028
8  11/24/2013 2013 -93.45932 29.78530
9  11/19/1994 1994 -93.58333 29.75000
10 11/15/2013 2013 -89.16171 29.45222

В некоторые дни существует несколько записей, в то время как некоторые записи не имеют даты. Те, у кого нет даты, мне не интересны. Что я хочу знать, так это то, сколько записей существует на каждую дату и вставить пропущенные дни, когда ни одна запись не была создана, поэтому для каждого дня года существует запись для каждого дня. год независимо от того, были ли записаны данные, например:

> head(z2)
     m_d y_2017 y_2016 y_2015 y_2014 y_2013
1 01-02     16     15      0     29      9
2 01-03      0     38     25     10      3
3 01-04     13     20     14      5      7
4 01-05     19      0      3      0     16
5 01-06     34     25     29     33     24
6 01-07      3     10      5     34      7

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

> #create a value for the aggregate function to sum
z$count<-rep(1, length(z$year))
m<-aggregate(count ~ date, data = z, sum)
> head(m)
            date count
1                  308
2     01/01/1980     1
3     01/01/1985     1
4     01/01/1995     1
5     01/01/1996     2
6     01/01/1997     1

Я понятия не имею, как перейти из этой таблицы, которая является необходимой мне информацией, в формат, который я хочу, находчивым способом. Я мог бы вручную установить подгруппу по годам и объединить данные каждого года с полным набором месяцев / дней для этого года, а затем создать новый df, используя все разные годы, но это кажется чрезмерно громоздким и повторяющимся, так как данные у меня идут назад в 1980. Кто-нибудь знает эффективный способ реорганизации этих данных в вышеуказанный формат?

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Использование базы R:

d=transform(aggregate(long~date+year,dat,length),date=format(strptime(date,"%m/%d/%Y"),"%m-%d"),count=long,long=NULL)
> as.data.frame.matrix(xtabs(count~date+year,d))
      1994 2013 2014 2017
01-03    0    0    1    0
01-08    0    0    1    0
01-18    0    0    0    1
01-22    0    0    0    1
11-15    0    1    0    0
11-19    1    0    0    0
11-24    0    1    0    0
12-28    0    1    0    0
12-31    0    1    0    0
0 голосов
/ 02 мая 2018

Вы можете легко создать ссылочный фрейм данных со всеми датами с 1980 года по настоящее время:

df$date <- as.Date(df$date, format = "%m/%d/%Y")
all_dates <- seq(from = as.Date("1980-01-01"), to = as.Date("2018-05-02"), by = 'days'))
ref_dates = data.frame(date = all_dates)

df <- merge(df, ref_dates, all.y = TRUE)
df$date <- substring(df$date, 6,10)  # remove year from date column

df_table <- table(df$date, df$year) # cross tab
final_df <- as.data.frame.matrix(df_table) # convert into dataframe if you like
0 голосов
/ 02 мая 2018

Если я правильно понимаю ваш вопрос, я бы использовал separate() из tidyr пакета, чтобы разделить столбец «дата» на «m_d» и «год». А затем, используя gather() из того же пакета, измените эту длинную таблицу на более широкую. После этого шага вы можете получить фрейм данных с именами «m_d», «y_2017», «y_2016» ...... Вы можете сделать sum(length()) позже для подсчета.

...