【发布时间】: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) < 1) next条件。 -
summaryBy来自哪里? -
我想获取唯一 ID,以便我可以在函数中设置子集。我也可以使用“唯一”来获得。
标签: r function ggplot2 dataframe