2016-11-29 15 views
1

私は予想通りdata.frame次いでR、is.na.dataset COLNAMESエラー

dataSet <- structure(list(J1 = "foo", J2 = structure(0.1, .Dim = c(1L, 1L 
))), .Names = c("J1", "J2"), row.names = 1L, class = "data.frame") 

print(colnames(dataSet)) 

戻り

[1] "J1" "J2" 

以下を使用。

しかし、

r <- is.na(dataSet) 
print(colnames(r)) 

戻り

[1] "J1" "" 

なぜこのhappingはありますか?実際のdata.frameを最小限の作業例に集約した後にdput()を使用してコードを作成したので、この奇妙な方法でdata.frameを作成します。私が使用している関数は、大文字の名前がis.naによってそのまま保持されているという前提に依存しています。これはほとんどのdata.framesでは動作しますが、これは動作しません。

+0

解決策は、最初の 'dataSet [] < - lapply(dataSet、as.vector)'を変換することができます。 –

答えて

3

2番目の列は無名の行列です。

sapply(dataSet, class) 
#   J1   J2 
# "character" "matrix" 

次に、is.naで起こっていることを見てみましょう。 is.naのためのデータフレーム方式の最初の数行は

head(is.na.data.frame, 5) 
#            
# 1 function (x)         
# 2 {           
# 3  y <- if (length(x)) {     
# 4  do.call("cbind", lapply(x, "is.na")) 
# 5  } 

is.na.data.frameているので、我々は簡単なステップに設定され、当社のデータを差し込むことによって、問題自分自身をデバッグすることができ、Rで書かれています。

lapply(dataSet, is.na) 
# $J1 
# [1] FALSE 
# 
# $J2 
#  [,1] 
# [1,] FALSE 

do.call(cbind, lapply(dataSet, is.na)) 
#   J1  
# [1,] FALSE FALSE 

だから我々は、列(行)の名前がcolnamesから取られている(rownames)の(rbind)私たちはhelp(cbind)に行けば、私たちはcbindについて

を見つけ、それが今cbind.に起こる知っていますこれらが行列のようなものである場合の議論。

ここでの議論は、第2列の行列です。名前は、データフレームのリスト名ではなく、その行列から取得されます。行列には名前がないので、結果の2番目の列名は空白です。

この特定の問題の迅速な解決策は、単に2番目の列を連結することです。

is.na(lapply(dataSet, c)) 
# J1 J2 
# FALSE FALSE 
関連する問題