Запись функции в R для итеративного подмножества кадра данных по времени - PullRequest
0 голосов
/ 29 декабря 2018

Я работаю с фреймом данных, который содержит случаи во времени, скажем, 10/01 / 18-12 / 31/18.В настоящее время я написал скрипт, который позволяет мне подгруппировать данные по дате, и он требует ручного ввода определенных дат.Вот сценарий с фиктивным набором данных:

> mydata
                  date dummy
1  2018-10-01 21:41:00     A
2  2018-10-03 21:41:00     B
3  2018-10-12 21:41:00     C
4  2018-11-01 21:41:00     D
5  2018-11-02 21:41:00     E
6  2018-11-12 21:41:00     F
7  2018-11-15 21:41:00     G
8  2018-12-02 21:41:00     H
9  2018-12-07 21:41:00     I
10 2018-12-12 21:41:00     J

#put date into readable format
mydata$date <- as.POSIXct(mydata$date, format="%m/%d/%y %H:%M") 

# TOCHANGE: Adjust time points accordingly.
t1 = mydata[mydata$date >= "2018-10-01" & mydata$date <= "2018-10-31",]  
t2 = mydata[mydata$date >= "2018-11-01" & mydata$date <= "2018-11-30",]  
t3 = mydata[mydata$date >= "2018-12-01" & mydata$date <= "2018-12-30",]  

Я чувствую, что это можно сделать более эффективно с помощью функции, особенно потому, что я хочу создавать подмножества с разными итерациями количества времени в подмножестве (например, каждую неделюКаждую неделю, каждый месяц).Я думаю, может быть, функция, которая требует ввода количества времени в днях, чтобы сохранить для каждого подмножества, а затем цикл создания подмножеств на основе этого количества времени для всего кадра данных?Или это не возможно, чтобы поставить даты в качестве входных данных, и было бы более целесообразно иметь # подмножеств в качестве входных данных?

Как бы вы написали функцию, которая могла бы сделать это?Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

подход data.table

library( data.table )

пример данных

dt <- fread("id date dummy
1  2018-10-01T21:41:00     A
2  2018-10-03T21:41:00     B
3  2018-10-12T21:41:00     C
4  2018-11-01T21:41:00     D
5  2018-11-02T21:41:00     E
6  2018-11-12T21:41:00     F
7  2018-11-15T21:41:00     G
8  2018-12-02T21:41:00     H
9  2018-12-07T21:41:00     I
10 2018-12-12T21:41:00     J", header = TRUE)

#set dates as Date
dt[, date := as.Date( date, format = "%Y-%m-%dT%H:%M:%S", tz = "Europe/Amsterdam" )]

поднабор

#subset by month == 10
dt[ month(date) == 10,]

#    id       date dummy
# 1:  1 2018-10-01     A
# 2:  2 2018-10-03     B
# 3:  3 2018-10-12     C

#list with subset for each month
lapply( unique(month(dt$date)), function(x) dt[ month(date) == x, ])

# [[1]]
#    id       date dummy
# 1:  1 2018-10-01     A
# 2:  2 2018-10-03     B
# 3:  3 2018-10-12     C
# 
# [[2]]
#    id       date dummy
# 1:  4 2018-11-01     D
# 2:  5 2018-11-02     E
# 3:  6 2018-11-12     F
# 4:  7 2018-11-15     G
# 
# [[3]]
#    id       date dummy
# 1:  8 2018-12-02     H
# 2:  9 2018-12-07     I
# 3: 10 2018-12-12     J
0 голосов
/ 29 декабря 2018

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

mydata$date <- as.POSIXct(mydata$date, format="%m/%d/%y %H:%M") 
mydata$month <- format(mydata$date,"%m")

month_df_list <- split(mydata, mydata$month)

# OCTOBER DATA FRAME
month_df_list$`10`

# NOVEMBER DATA FRAME
month_df_list$`11`

# DECEMBER DATA FRAME
month_df_list$`12`

Обратите внимание, что вы не теряете функциональность данныхкадр, если хранится в списке.И переименовать:

month_df_list <- setNames(mydata, paste0("t", seq_along(month_df_list)))

# OCTOBER DATA FRAME
month_df_list$t1

# NOVEMBER DATA FRAME
month_df_list$t2

# DECEMBER DATA FRAME
month_df_list$t3
...