2016-03-03 177 views
1

我有這樣如何在函數內處理「下標越界」錯誤? R中

Datetime <- c("2016-03-03 05:30:13", "2015-03-02 12:45:00", "2016-03-01 02:53:20", "2016-02-28 03:22:18", 
       "2016-03-02 09:42:10", "2016-03-01 20:55:50", "2016-02-28 21:14:10", "2016-02-26 05:42:16", 
       "2016-03-02 08:31:15", "2016-03-02 09:13:10", "2016-03-01 00:45:14", "2016-02-26 05:56:00", 
       "2016-02-02 13:44:00", "2016-02-02 14:41:20", "2016-02-01 15:33:10", "2016-01-25 04:24:00", 
       "2016-03-02 17:24:12", "2016-03-01 17:28:16", "2016-02-28 18:22:34", "2016-02-27 02:34:31") 

ID <- c("A","A","A","A","B","B","B","B","C","C","C","C","D","D","D","D","E","E","E","E") 
PT <- c(27,35,38,22,35,39,7,15,37,25,38,42,45,19,17,25,32,35,39,26) 

df <- data.frame(Datetime,ID,PT) 
df$Datetime <- as.POSIXct(df$Datetime,format="%Y-%m-%d %H:%M:%S") 

我使用這些線來設置,我想子集

today <- as.POSIXlt(Sys.time()) 
today$mday <- today$mday 
today$hour = "6" 
today$min = "30" 
today$sec = "0" 
Back2weeks <- today 
Back1day <- today 
Back2weeks$mday <- Back2weeks$mday-14 
Back1day$mday <- Back1day$mday-1 

我想使用的功能來自動創建ggplots輸出地塊日期時間一個數據幀每一個ID,我做這種方式

plots <- function(a) { 
    if (nrow(a)>0) { 
    ggplot(data = a,aes(x=Datetime,y=PT)) + geom_line(size = 0.5) + geom_point(size=3) 
    } 
} 

lss<-list() 
plot_lss<-list() 
UniqueID <- summaryBy(ID~ID, data = df, FUN = function(x) { c(n = length(x)) }) 

for (j in 1:(nrow(UniqueID))) 
{ 
    cat(j) 
    id <- as.character(UniqueID$ID[[j]]) 

    df1 <- subset(df, ID == id) 
    df2 <- subset(df1, df1$Datetime>Back2weeks & df1$Datetime<today) 

    lss[[j]] <- df2 

    plotdata <- subset(df2, ID == id) 

    plot_lss[[j]] <- plots(plotdata) 
    print(plot_lss[[j]]) 
    Sys.sleep(0) 
} 

雖然這在首次運行3個地塊,4號地塊不出來,因爲此ID的日期時間爲超出我的子集範圍。現在函數停在這裏,並在plot_lss [[j]]:下標越界「中出現錯誤」錯誤「,這很好,但我希望該函數繼續運行並輸出日期時間在範圍內的第5個圖。在這種情況下,如何讓函數繼續運行直到結束並防止退出循環?請在此提供您的想法。

+2

測試if(nrow(plotdata)<1)next'條件可以做。 –

+1

'summaryBy'從哪裏來? – Julius

+0

我想獲得唯一的ID,所以我可以在函數中子集。我本來也可以使用「獨特」來獲得。 – Sharath

回答

2

也許

plotdata <- subset(df2, ID == id) 
    if(nrow(plotdata) == 0) 
    next 

夠嗎?

+0

謝謝@Julius。我仍然在學習R,從來不知道「下一個」。感謝您指出。這看起來很簡單,整齊地完成這項工作。 – Sharath