2014-02-17 2 views
0

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

Sunrise    Sunset 
2010-01-19 08:55:12 2010-01-19 17:26:34 

я использовал раскол разделить кадр данных по дате, чтобы дать большой список, содержащий 10 элементов (дни)

# Splits data frame by date 
sepdays<- split(df, df$Date) 

# Function to split each day into day and night hours 
daynight <- function(){ 
rise <- as.character(df$Sunrise[1]) 
rise <- substr(rise, 12,19) 
set <- as.character(df$Sunset[1]) 
set <- substr(set, 12,19) 
day <- df[df$Time>rise & df$Time<set, ] 
df.night1<-df[df$Time<rise,] 
df.night2<-df[df$Time>set,] 
night <- merge.data.frame(df.night1,df.night2, sort = TRUE, all.x = TRUE, all.y=TRUE) 
return(table(day$Activity)) 
} 

# Apply function over list of days 
lapply(sepdays,daynight) 

Когда я бег lapply я получаю неиспользованные аргументы ошибку:

Error in FUN(X[[1L]], ...) : unused argument (X[[1]])

Я также не уверен, что это лучший способ идти о получении определенного времени восхода/наборе для каждого согласующего дня. Я понимаю, что у моей функции нет аргументов, но я новичок R, поэтому не совсем уверен, что я делаю.

Вот как выглядят мои данные.

Date  Time  Activity Sunrise    Sunset 
2010-01-19 23:58:00 1   2010-01-19 08:55:12 2010-01-19 17:26:34 
2010-01-19 23:59:00 1   2010-01-19 08:55:12 2010-01-19 17:26:34 
2010-01-19 00:00:00 0   2010-01-20 08:54:13 2010-01-20 17:28:11 
2010-01-19 00:01:00 0   2010-01-20 08:54:13 2010-01-20 17:28:11 
2010-01-20 00:02:00 1   2010-01-20 08:54:13 2010-01-20 17:28:11 
2010-01-20 00:03:00 0   2010-01-20 08:54:13 2010-01-20 17:28:11 
2010-01-20 00:04:00 1   2010-01-20 08:54:13 2010-01-20 17:28:11 

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

2010-01-19 
1 0 
2 0 

2010-01-20 
1 0 
2 3 
+0

Вы пытаетесь изобрести колесо. Используйте средства и пакеты времени и времени R, такие как plyr, dplyr или data.table. Если вы четко сформулируете свою конечную цель и добавите примерные данные (например, используйте 'dput (head (df))') в свой вопрос, кто-то должен показать вам, как это сделать легко. – Roland

+0

Каковы ваши выходные таблицы вывода, связанные с вводом примера? – Roland

+0

В течение каждого дня должна быть указана таблица значений активности. То есть общее количество 1s и общее количество 0s за каждый день. – user3021648

ответ

1

Я не совсем уверен, потому что ваш вопрос довольно расплывчатым, но я думаю, что вы могли бы сделать это:

DF <- read.table(text="Date,  Time,  Activity, Sunrise,    Sunset 
2010-01-19, 23:58:00, 1,   2010-01-19 08:55:12, 2010-01-19 17:26:34 
2010-01-19, 23:59:00, 1,   2010-01-19 08:55:12, 2010-01-19 17:26:34 
2010-01-19, 00:00:00, 0,   2010-01-19 08:55:12, 2010-01-19 17:26:34 
2010-01-19, 00:01:00, 0,   2010-01-19 08:55:12, 2010-01-19 17:26:34 
2010-01-19, 09:01:00, 0,   2010-01-19 08:55:12, 2010-01-19 17:26:34 
2010-01-20, 00:02:00, 1,   2010-01-20 08:54:13, 2010-01-20 17:28:11 
2010-01-20, 00:03:00, 0,   2010-01-20 08:54:13, 2010-01-20 17:28:11 
2010-01-20, 00:04:00, 1,   2010-01-20 08:54:13, 2010-01-20 17:28:11", header=TRUE, sep=",") 

DF$datetime <- as.POSIXct(paste(DF$Date, DF$Time), "%Y-%m-%d %H:%M:%S", tz="GMT") 
DF$date <- as.Date(DF$datetime) 
DF$Sunrise <- as.POSIXct(DF$Sunrise, "%Y-%m-%d %H:%M:%S", tz="GMT") 
DF$Sunset <- as.POSIXct(DF$Sunset, "%Y-%m-%d %H:%M:%S", tz="GMT") 


DF$day <- (DF$datetime > DF$Sunrise) & (DF$datetime < DF$Sunset) 

#  Date  Time Activity    Sunrise    Sunset   datetime day  date 
#1 2010-01-19 23:58:00  1 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 23:58:00 FALSE 2010-01-19 
#2 2010-01-19 23:59:00  1 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 23:59:00 FALSE 2010-01-19 
#3 2010-01-19 00:00:00  0 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 00:00:00 FALSE 2010-01-19 
#4 2010-01-19 00:01:00  0 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 00:01:00 FALSE 2010-01-19 
#5 2010-01-19 09:01:00  0 2010-01-19 08:55:12 2010-01-19 17:26:34 2010-01-19 09:01:00 TRUE 2010-01-19 
#6 2010-01-20 00:02:00  1 2010-01-20 08:54:13 2010-01-20 17:28:11 2010-01-20 00:02:00 FALSE 2010-01-20 
#7 2010-01-20 00:03:00  0 2010-01-20 08:54:13 2010-01-20 17:28:11 2010-01-20 00:03:00 FALSE 2010-01-20 
#8 2010-01-20 00:04:00  1 2010-01-20 08:54:13 2010-01-20 17:28:11 2010-01-20 00:04:00 FALSE 2010-01-20 

table(DF[,c("date", "Activity", "day")]) 

#, , day = FALSE 
# 
#   Activity 
#date   0 1 
# 2010-01-19 2 2 
# 2010-01-20 1 2 
# 
#, , day = TRUE 
# 
#   Activity 
#date   0 1 
# 2010-01-19 1 0 
# 2010-01-20 0 0 

Это легче читать и гораздо эффективнее.

Смежные вопросы