1

While ループと If ステートメントを使用して、グラフにテキストを生成しています。

If ステートメントをエラー チェックとして使用しようとしています。列の経度と緯度にデータがない場合は、これをスキップして次の行に進みます。

表示されているデータ テーブルでは、Lat 列と Lon 列に値がないため、以下に示すように NA として表示されます。

  myData3[1:7,]
  ISO3V10              Country No.of.Documents Lat Lon
1     AGO               Angola               0  NA  NA
2     ALB              Albania               0  NA  NA
3     ARE United Arab Emirates               0  NA  NA
4     ARG            Argentina               7  NA  NA
5     ARM              Armenia               0  NA  NA
6     AUS            Australia              96 151 -34
7     AUT              Austria              28  NA  NA

これまでに書いたコードは次のとおりです。

 myData3 <- read.delim(file="C:\\Documents\\RScriptAnalysis\\noofpublications3.txt", header = TRUE, sep = "\t")
 data = 0
 n = 0
 while(data < 100){
 if (myData3["Lat", 0] & myData3["Lon", 0])
   {
   data = data +1
   n = n +1
   }
else {
  text(myData3[n,"Lat"],myData3[n,"Lon"],myData3[n,"No.of.Documents"],adj=0.5)
  n = n +1
  data = data +1
  }
}

コードを変更すると、次のエラー メッセージが表示されます。

  Error in matrix(unlist(value, recursive = FALSE, use.names = FALSE), nrow = nr,  : 
 'data' must be of a vector type

  Error in 0 = while (data < 1000) { : 
  invalid (do_set) left-hand side to assignment

このエラーチェックを行う方法を整理し、これを実行できるようにコードを適応させるには、助けが必要です!!!

ご不明な点がございましたら、お気軽にお問い合わせください。

乾杯、ジェス

4

1 に答える 1

3

それはこの行です:

if (myData3["Lat", 0] & myData3["Lon", 0])

nのth 行と Lat/Lon 列myData3が NAかどうかを確認します。

行列にアクセスするには、次のようにしnますLat

myData3[n,'Lat']

または (データ フレームの場合):

myData3$Lat[n]

何かが NA (データ欠落) かどうかをテストするには、を使用しますis.na(を参照?is.na)。

そう:

if ( is.na(myData$Lat[n]) && is.na(myData$Lon[n]) )

動作するはずです。(&&これは「and」演算子/論理ショートカットであることに注意してください。&バージョンは(たとえば)ベクトルを要素単位で比較します。これにより、スカラーで使用する意味がありません)c(TRUE, TRUE, FALSE) & c(FALSE, TRUE, FALSE)c(FALSE, TRUE, FALSE)


上記で問題は解決しますが、コードにさらに注意してください: R はベクトル化された言語です。つまり、多くの場合、ループを実行する代わりに、値がスカラーであるふりをして同じコードを使用できます。

たとえば、x + 5where xis ベクトルは の各要素に追加5されます。つまり、 1 からまでの各要素に対して実行するループを記述する必要はありません。xx[i] + 5ilength(x)

myData3上記では、Lat と Lon が次のようにならない行番号のベクトルを生成できます。

idx = !is.na(myData3$Lat) & !is.na(myData3$Lon)

ここでidxは、行数と同じ長さの TRUE と FALSE のベクトルになります(要素ごとの and を取得する 代わりに、ここでmyData3使用したことに注意してください)。Lat と Lon の両方が NA でない場所、およびそれ以外の場所になります。&&&idxTRUEFALSE

次に、プロットするには、次のtextように有効な行を一度にフィードできます。

text(myData3$Lat[idx],myData3$Lon[idx],myData3$No.of.Documents[idx],adj=0.5)

これは、ほとんどの R 関数がベクトル化されているため、ベクトル全体をフィードすることができ、各要素をループする効果があります。

whereが TRUE の行、つまり Lat と Lon の両方が存在するmyData3$Lat[idx]行を選択することに注意してください。myData3$Latidx

ベクトル化された言語 (R や Matlab など) を初めて使用する場合でも、心配する必要はありません。楽しい!

于 2012-05-17T23:57:20.960 に答える