2012-01-14 18 views
4

AVGを使用して平均をc(NA, NA, 3, 4, 5, 6, 7, 8, 9, 10)にしようとすると、予想される6.5ではなく5.2の値が得られます。sqldfを使用したNAの値

# prepare data and write to file 
write.table(data.frame(col1 = c(NA, NA, 3:10)), 
     "my.na.txt", row.names = FALSE) 

mean(c(NA, NA, 3:10), na.rm = TRUE) # 6.5 

my.na <- read.csv.sql("my.na.txt", sep = " ", 
     sql = "SELECT AVG(col1) FROM file") # 5.2 

# this is identical to 
sum(3:10)/10 

unlink("my.na.txt") # remove file 

これは、sql(df)がNA値をゼロとして扱うと考えています。 na.rm引数(R)を使用して実行できるので、SQL呼び出しでNA値を無視(除外)することはできますか?

+1

は 'sqldf'言う:「sqldf'は、データ・ベースにファイルを転送するために使用する速度のために意図されていると、彼らはread.table''ほど柔軟ではありません 'dbWriteTable/sqliteImportFile'ルーチン'こと。」理想的な解決法ではないかもしれませんが、 'read'scs.sql'の' filter'引数は、 'NA'行をフィルタリングしてからSQLiteに読み込むために使用できます。 '?sqldf'とsqldfホームページ:http://sqldf.googlecode.comに' filter'引数の例がいくつかあります。 –

答えて

6

NA値を無視するようにクエリを変更します。

SELECT AVG(col1) 
FROM file 
WHERE col1 IS NOT \"NA\" 
+0

ハム、私は 'col1 IS NOT NULL'ファイルから' SELECT AVG(col1)FROMファイル 'を使用していますが、まだ5.2を取得しています。 –

+1

は、DB N/AまたはNULLの値ですか? (col1がnullでないファイルからcol1を選択する)[NAを表示するか?]または(col1 <> 'NA' [NAを表示するか?]]ファイルからCol1を選択する – xQbert

+0

'AVG(col1)FROMファイルを使用するcol1 is not \ "NA \"はうまく動作します.NAsが引用されているので、それらをエスケープする必要があります。 –

2

問題はread.csv.sql機能が不足している値を認識しないということで、代わりにNULLを、ゼロに変換します。 最初にdata.frameにデータをロードしてからsqldfを呼び出すと、これは発生しません。 ?

d <- read.csv("my.na.txt") 
sqldf("SELECT AVG(col1) FROM d") # 6.5 
+1

data.frameにデータを読み込むことはできません。私の場合は質問。 –

関連する問題