1. ホーム
  2. r

[解決済み】R:関数に有限な'ylim'値が必要

2021-12-29 09:47:56

質問

data.frameのデータをプロットしたい。 xy で定義された)各グループについて ID ). 1946年以前の年がグループに含まれる場合。 plot 2 を実行する必要があります。1946年から2014年の間の年号の場合。 plot1 を実行する必要があります。

私の問題:これはNA値なしでうまく動作しますが、私はデータギャップを持っているので、これらのデータギャップを定義するためにNAに依存しています。このため、エラーが発生します。 error in plot.window(need finite 'ylim' values) . を配置しようとしたのですが finite=Tplot1 をY軸にとったが、これでは subscript out of bounds というエラーが発生します。これを解決して、グラフィックを正しくプロットする方法はありますか?

以下は、私のコードです。長いですが、コードの大部分は次のように構成されています。 plot() オプションに依存しています。

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

解決方法は?

plot1 を変更します。 y = range(x$VALUE)y = range(x$VALUE, na.rm=TRUE) を削除する NA が欠落している場合。

もう一つ問題があります。それは、両方の関数で ind[[i]] これは、このコードがループの一部であったことを意味すると思われます。私の推測では、すべての参照先が ind[[i]]x .