2016-11-29 67 views
1

當我使用下面data.frameR,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,因爲我在將真實的data.frame濃縮爲最小工作示例之後,使用dput()創建了代碼。我使用的函數依賴於is.na保留完整的名稱,這似乎適用於大多數data.frames,但不適用於此。

+0

該解決方案可能會首先轉換'dataSet [] < - lapply(dataSet,as.vector)'' –

回答

3

請記住,您的第二列是未命名的矩陣。

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 

所以我們知道它在cbind.發生現在,如果我們去help(cbind),我們發現

對於cbindrbind)的列(行)名從colnamesrownames)的拍攝如果這些參數是矩陣狀的話。

這裏討論的論點是第二列中的矩陣。名稱取自該矩陣,而不是數據框列表名稱。由於矩陣上沒有任何名稱,所以第二列的名稱是空白的。

解決這個問題的一個快速解決方案是簡單地連接第二列。

is.na(lapply(dataSet, c)) 
# J1 J2 
# FALSE FALSE