【问题标题】:How to handle "subscript out of bounds" error inside a function? in R如何处理函数内的“下标越界”错误?在 R 中
【发布时间】:2016-03-03 16:28:06
【问题描述】:

我有一个这样的数据框

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 个图运行,但由于 ID 的日期时间超出了我的子集范围,因此第 4 个图没有显示。现在函数停在这里并抛出一个错误,说“plot_lss[[j]] 中的错误:下标超出范围”,这很好,但我希望函数继续运行并输出第 5 个绘图日期时间在范围内。在这种情况下,我如何使函数一直运行到最后并防止退出循环?请在此提供您的想法。

【问题讨论】:

  • 可以测试if(nrow(plotdata) &lt; 1) next 条件。
  • summaryBy 来自哪里?
  • 我想获取唯一 ID,以便我可以在函数中设置子集。我也可以使用“唯一”来获得。

标签: r function ggplot2 dataframe


【解决方案1】:

也许

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

够了吗?

【讨论】:

  • 谢谢@朱利叶斯。我还在学习 R 并且从来不知道“下一个”。感谢您指出。这看起来很简单,并且可以很好地完成工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多