R:

2014-09-16 35 views
6

işlevinde sonlu 'ylim' değerlerine gereksinim var. Veriler, her grup için xy veri dosyasında (ID tarafından tanımlanmış) çizim yapmak istiyorum. 1946'dan bir yıl önce bir grupta, plot 2 yürütülmelidir. Yıllar 1946 ve 2014 arasında olduğunda, plot1 yürütülmelidir.R:

Sorunum: Bu, NA değerleri olmadan düzgün çalışıyor, ancak veri boşluklarım olduğu için, bu veri boşluklarını tanımlamak için NA'lara güveniyorum. Bu yüzden bir hata alıyorum: error in plot.window(need finite 'ylim' values). finite=T'u plot1'da y eksenine koymaya çalıştım ancak bu subscript out of bounds hatası veriyor. Bunu çözebileceğim bir yol var mı ve grafikler doğru bir şekilde çizildi mi?

Aşağıdaki kodumda: Uzun ama kodun çoğunda güvendiğim plot() seçenekleri bulunuyor. plot1 yılında

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

cevap

4

, NA eksik değerleri kaldırmak için y = range(x$VALUE, na.rm=TRUE) için y = range(x$VALUE) değiştirin.

Başka bir sorun var, yani her iki işlevde de ind[[i]]'a atıfta bulunursunuz, bu kodun bir noktada bir döngünün parçası olduğunu varsayalım. Benim tahminim ind[[i]] tüm referansları x olmalıdır.

+0

bu tam olarak buydu! Teşekkür ederim!! – kurdtc

+2

özellikle, 'NA' (ve başka bir şey) dönen '' '' '' inanıyorum. arsa gibi bir şey (1: 5, c (2,3, NA, 5, NA)) 'başarıyla yürütecektir. –

+1

@CarlWitthoft Evet, her iki değer de "NA" olduğunda. – Thomas