R: Noodzaak van eindige ‘Ylim’ -waarden in functie

Ik wil de gegevens in gegevens uitzetten. Frame xyvoor elke groep (gedefinieerd door ID). Wanneer een jaar vóór 1946 in een groep zit, moet plot 2worden uitgevoerd. Wanneer de jaren tussen 1946 en 2014 zijn, moet plot1worden uitgevoerd.

Mijn probleem: dit werkt prima zonder NA-waarden, maar omdat ik gegevenshiaten heb, vertrouw ik op NAS om deze gegevenshiaten te definiëren. Dit is de reden waarom ik een foutmelding krijg: error in plot.window(need finite 'ylim' values). Ik heb geprobeerd finite=Tin plot1op de Y-as te plaatsen, maar dit geeft een subscript out of boundsFOUT. Is er een manier waarop ik dit zou kunnen oplossen en dat de grafische weergave correct is geplot?

In het volgende is mijn code: het is lang maar het grootste deel van de code bestaat uit plot()opties waarop ik afhankelijk ben.

# 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)))

Antwoord 1, Autoriteit 100%

In plot1, wijzig y = range(x$VALUE)naar y = range(x$VALUE, na.rm=TRUE)Om NAontbrekende waarden te verwijderen.

U hebt nog een probleem, namelijk dat in beide functies u verwijst naar ind[[i]], die ik aannemen dat deze code op een gegeven moment deel uitmaakte van een lus. Mijn gok is alle verwijzingen naar ind[[i]]Moet xzijn.

Other episodes