R: need final ylim values ​​in function

I would like to build the data in data.frame xy for each group (defined by ID ). If the year before 1946 is in a group, plot 2 must be completed. When the years between 1946 and 2014, plot1 must be executed.

My problem: this works fine without NA values, but since I have data gaps, I rely on NA to identify these data gaps. This is why I get the error message: error in plot.window(need finite 'ylim' values) . I tried putting finite=T in plot1 along the y axis, but this gives a subscript out of bounds error. Is there a way to solve this problem and that the graphics are correctly built?

Below is my code: it is long, but most of the code consists of plot() options, which I rely on.

 # read in sample data and split it up by group (defined by ID) xy <- data.frame(NAME=c("NAME2","NAME2","NAME2","NAME2","NAME2","NAME3","NAME3","NAME3","NAME3","NAME5","NAME5","NAME5","NAME5"), ID=c(48,48,48,48,48,32,32,32,32,67,67,67,67),YEAR=c(1981,1983,1984,1988,1989,1984,1984,1988,1988,1899,1933,1948,1958),VALUE=c(0,205,-570,0,-310,-3680,-3680,NA,-3680,0,NA,13,-98)) ind <- split(x = xy,f = xy[,'ID']) # Plot Scenario 1: if only years between 1946 and 2014 are present for each group do this: plot1 <- function(x) { fname <- paste0(x[1, 'ID'], '.png') png(fname, width=1679, height=1165, res=150) par(mar=c(6,8,6,5)) plot(x = c(1946, 2014), y = range(x$VALUE), type='n', main=x[1, 'NAME'], xlab="Time [Years]", ylab="Value") axis(2, at = seq(-100000, 100000, 500), cex.axis=1, labels=FALSE, tcl=-0.3) points(ind[[i]][,c('YEAR','VALUE')], type="l", lwd=2) points(ind[[i]][,c('YEAR','VALUE')], type="p", lwd=1, cex=1, pch=21, bg='white') abline(h=0) dev.off() } # Plot Scenario 2 if years under 1946 are present do this: plot2 <- function(x) { fname <- paste0(x[1, 'ID'], '.png') png(fname, width=1679, height=1165, res=150) par(mar=c(6,8,6,5)) plot(x[,c('YEAR','VALUE')], type='n', main=x[1, 'NAME'], xlab="Time [Years]", ylab="Value [mm]") axis(2, at = seq(-100000, 100000, 500), cex.axis=1, labels=FALSE, tcl=-0.3) points(ind[[i]][,c('YEAR','VALUE')], type="l", lwd=2) points(ind[[i]][,c('YEAR','VALUE')], type="p", lwd=1, cex=1, pch=21, bg='white') abline(h=0) dev.off() } # Execute functions lapply(ind, function(x) ifelse(any(x$YEAR < 1946 & x$YEAR < 2014), plot2(x), plot1(x))) 
+6
source share
1 answer

In plot1 change y = range(x$VALUE) to y = range(x$VALUE, na.rm=TRUE) to remove NA missing values.

You have one more problem, namely that in both functions you are referencing ind[[i]] , which I suppose means that at some point this code was part of a loop. I assume that all references to ind[[i]] should be x .

+4
source

Source: https://habr.com/ru/post/975359/


All Articles