2

CSVを読み込んだので、「空の」行と列を見つけて、 isempty = function(x) all(is.na(x) | x == 0 | x == "") すべての列に同じようなものを適用したいと思います。最初の列はモード文字で、他のすべては数値です。

ただし、実行するとemptycols = apply(mydf, 2, isempty)、返される論理ベクトルはすべてFALSEです。

私が試してみるとemptycols = apply(mydf[ , -1], 2, isempty)、それは完全に機能し、すべての「空の」列に対してTRUEである論理ベクトルを返します。

とにかくうまく機能するsapplyを使用できることは承知していますが、それでも疑問に思います。この動作の原因は何ですか。最初の(文字)列は、他のすべての列への関数の適用にどのように影響しますか?

4

1 に答える 1

2

@Backlinは正しかった。このようにisemtpyを変更した場合:

isempty = function(x) c(typeof(x), all(x == 0 | is.na(x) | x == ""))

次の結果は、何が起こるかを示しています。

> apply(mydata, 2, isempty)
     one         two         three      
[1,] "character" "character" "character"
[2,] "FALSE"     "FALSE"     "FALSE" 

> apply(mydata[,-1], 2, isempty)
     two       three    
[1,] "integer" "integer"
[2,] "TRUE"    "TRUE"   

@Backlinの引用: "最初の列により、データフレームが文字マトリックスに変換されます。" 0は0と一致しません。ただし、[、-1]を指定すると、数値マトリックスに変換され、正常に機能します。 。

sapplyはそれ自体がより良く動作します:

> sapply(mydata, isempty)
     one         two       three    
[1,] "character" "integer" "integer"
[2,] "FALSE"     "TRUE"    "TRUE"   
于 2012-08-17T12:47:49.807 に答える