删除NA和列的“单元格”

时间:2017-06-12 14:51:37

标签: r

我有这个数据集:

 df<-  structure(list(p1 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA), p2 = structure(c(NA, NA, 5L, 6L, 
    NA, 2L, 7L, NA, NA, 4L, NA, 3L, NA, 1L, 1L, 1L, 1L), .Label = c("", 
    "R16", "R29", "R3", "R36", "R40", "R56"), class = "factor"), 
        p3 = structure(c(NA, 1L, NA, NA, NA, NA, NA, NA, NA, NA, 
        NA, NA, NA, NA, NA, NA, NA), .Label = "R33", class = "factor")), .Names = c("p1", 
    "p2", "p3"), class = "data.frame", row.names = c(NA, -17L))

我想删除“单元格”而不是包含na的行。

我试过了:

na.omit(df)

但这不起作用我猜是因为它适用于整行。

如何从细胞而不是整行中移除NA?

示例输出:

p2  p3
R36 R33
R40 
R16 
R56 
R3  
R29 

1 个答案:

答案 0 :(得分:2)

当对象是数据帧时,您不能这样做,因为数据帧是一组相等长度的列表对象。所以数据框基本上是格式化列表!并且您的输出要求列表项的长度不同。

首先,您应该将数据框转换为列表,然后翻阅列表项:

dfl <- as.list(df)
dfn <- lapply(dfl, function(x) x[!is.na(x)])

输出是:

> dfn
$p1
logical(0)

$p2
 [1] R36 R40 R16 R56 R3  R29                
Levels:  R16 R29 R3 R36 R40 R56

$p3
[1] R33
Levels: R33

当您尝试再次将其转换为数据框时:

> as.data.frame(dfn)
    Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
      arguments imply differing number of rows: 0, 10, 1