Ik wil de gegevens in gegevens uitzetten. Frame xy
voor elke groep (gedefinieerd door ID
). Wanneer een jaar vóór 1946 in een groep zit, moet plot 2
worden uitgevoerd. Wanneer de jaren tussen 1946 en 2014 zijn, moet plot1
worden 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=T
in plot1
op de Y-as te plaatsen, maar dit geeft een subscript out of bounds
FOUT. 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 NA
ontbrekende 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 x
zijn.