2016-11-29 21 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