2017-05-08 12 views
1

的开始和结束我有一个data看起来如下:功能查找条件选择

Date | Time | Temperature 
16995 | "12:00" | 23 
16995 | "12:30" | 24 
... 
17499 | "23:30" | 23 
17500 | "00:00" | 24 

我正在写一个函数来选择一个范围内根据一定的开始和结束的时间点的情况下。为此,我需要确定start_ptend_pt索引,这些索引应与数据框中的一对行匹配。

select_case <- function(df,date,time) { 
     start_pt = 0 
     end_pt = 0 
     for (i in 1:nrow(df)) { 
     if ((date[i] == 17000) & (time[i] == "12:00")) { 
      start_pt <- i 
      return(start_pt) 
     } else { 
      next 
     } 
     } 
     for (i in start_pt:nrow(df)) { 
     if (date[i] == 17500) { 
      end_pt <- i - 1 
      return(end_pt) 
      break 
     } else { 
      next 
     } 
     } 
     return(df[start_pt:end_pt,]) 
    } 

当我打电话:

test <- select_case(data,data$Date,data$Time) 
test 

我想到以下几点:

Date | Time | Temperature 
17000 | "12:00" | 23 
17000 | "12:30" | 24 
... 
17499 | "23:00" | 23 
17499 | "23:30" | 23 

相反,我得到了

[1] 1 

不知道在那里我得到它错在这里。当我分别运行R控制台中的两个for循环,并替换每个循环的相应参数时,我得到了start_ptend_pt的正确索引。

+0

我不太明白start_pt和end_pt的逻辑。您是否尝试选择固定的行数,或者您是否有兴趣根据不同的开始日期和时间来分组数据? –

+0

因为我认为如果我需要将相同的子集功能应用于日期和时间可能不同的类似数据集(例如,不完整的数据),它会更方便。 ((data $ Date == 17000)&&(test $ Time ==“12:00”)) end < - tail(which(test($ date == 17499),n = 1) test < - test [start:end,]' – user94216

+0

那么你想要选择固定数量的行吗?为什么不把'start_pt'和'end_pt'作为你函数的参数? –

回答

0

我试图把每个循环放在一个单独的函数中,名为sta(date,time)end(date)。然后,我捆成以下功能:

binder <- function(date,time) { 
    return(sta(date,time),end(date)) 
} 

,并呼吁

sta_end <- binder(date,time) 

我得到了错误:

Error in return(sta(date, time), end(date)) : 
    multi-argument returns are not permitted 

所以我将它们结合在一起,它的工作:

​​3210

所以我在原来的fu中犯的错误我使用return() 3次,该功能将只返回第一个是start_pt。于是我拿出前两个return()并保留了最后一个:

return(df[start_pt:end_pt,]) 

这个工作,我得到了预期的结果。