2014-10-21 2 views
0

В настоящее время у меня есть массив из списка (GroupA), как в следующем примере:Как создать несколько правил для функции «lapply»

$AAAAAA 
     time timegap 
1 06:00:00  0 
2 07:00:00  60 
3 08:00:00  40 
4 09:00:00  0 
5 10:00:00  30 

$BBBBBBB 
     time timegap 
1 06:00:00  0 
2 07:00:00  60 
3 08:00:00  40 
4 09:00:00  0 
5 10:00:00  30 

Я пытаюсь создать функцию, которая генерирует фиктивную переменную, если timegap больше определенного числа. Но проблема в том, что число для создания фиктивной переменной будет отличаться от других, если время в диапазоне от 07:00:00 до 09:00:00.

Что я сделал следующим образом:

dummytime<-function(x){ 
    if(x$time>times("07:00:00") & x$time<times("09:00:00")){ 
    d<-c(1200) 
    } 
    else{ 
    d<-c(600) 
    } 
    dummytime<- as.numeric(x$timegap>=d) 
    as.data.frame(dummytime) 
} 

dumtime<-lapply(groupm2,dummytime) 

Однако, я получил сообщение об ошибке, как это:

Error in if (as.logical(x$time > times("07:00:00") & x$time < times("09:00:00"))) 
{ : missing value where TRUE/FALSE needed 

Любое предложение? Благодарим за помощь заранее.

+0

Лучше упомянуть пакет, который имеет 'times' функция – akrun

+0

@akrun, спасибо за уведомления. пакет, который включает функцию времени, фактически является «chron». Это пакет для даты и времени. – SmithWang

ответ

1

Это один из способов. Поскольку вы использовали пакет chron для преобразования символа во времени. Я сделал это. Затем я создал список. Затем lpply.

library(chron) 

# time to Class 'times' 
df1$time <- chron(times = df1$time) 
df2$time <- chron(times = df2$time) 

# Create a list 
ana <- list(df1 = df1, df2 = df2) 

#$df1 
#  time timegap 
#1 06:00:00  0 
#2 07:00:00  60 
#3 08:00:00  40 
#4 09:00:00  0 
#5 10:00:00  30 

lapply(ana, function(x){ 
       x$test <- ifelse(x$time >= "07:00:00" & x$time <= "09:00:00", 
       1200, 600) 
       x 

    }) 

#$df1 
#  time timegap test 
#1 06:00:00  0 600 
#2 07:00:00  60 1200 
#3 08:00:00  40 1200 
#4 09:00:00  0 1200 
#5 10:00:00  30 600 

#$df2 
#  time timegap test 
#1 06:00:00  0 600 
#2 07:00:00  60 1200 
#3 08:00:00  40 1200 
#4 09:00:00  0 1200 
#5 10:00:00  30 600 

Или

lapply(ana, transform, 
     test = ifelse(time >= "07:00:00" & time <= "09:00:00", 1200, 600)) 
+0

спасибо, @ jazzurro, я понял ключ от вашего скрипта. Actuall, я достиг функции, которую я хочу создать следующим образом: dummytime <-function (x) { d <-ifelse (x $ time> times ("07:00:00") & x $ time = d) as.data.frame (dummytime) } – SmithWang

+0

@SmithWang Я только что пересмотрел свой ответ , Я рад, что ты нашел свой путь. :) – jazzurro

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