【问题标题】:R, is.na.dataset colnames errorR,is.na.dataset colnames 错误
【发布时间】:2016-11-29 16:28:33
【问题描述】:

当我使用以下data.frame时

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" ""  

为什么会这样?我以这种奇怪的方式创建了 data.frame,因为在将真实的 data.frame 压缩为最小的工作示例之后,我使用 dput() 创建了代码。我正在使用的一个函数依赖于这样一个假设,即 colnames 由 is.na 保持完整,这似乎适用于大多数 data.frames 但不适用于这个。

【问题讨论】:

  • 解决办法可以先转换dataSet[] &lt;- lapply(dataSet, as.vector)

标签: r


【解决方案1】:

请记住,您的第二列是一个未命名的矩阵。

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),我们会发现

对于cbind (rbind),列(行)名称取自参数的colnames (rownames),如果它们是类似矩阵的。

这里讨论的参数是第二列中的矩阵。名称取自该矩阵,而不是数据框列表名称。由于矩阵上没有任何名称,因此生成的第二列名称为空白。

此特定问题的快速解决方案是简单地连接第二列。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多