删除“细胞”与NA和列

问题描述:

我有这样的数据集:删除“细胞”与NA和列

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.omit(df) 

但这不是工作,我猜是因为它是整行。

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

输出示例:

p2 p3 
R36 R33 
R40 
R16 
R56 
R3 
R29 
+2

为什么要删除'NA'?无论如何,如果你想要推断空字符值,你可以这样做:''df [is.na(df)] Jaap

+1

也许你想要做'lapply(as.list(df),function(x) x [!is.na(x)])' –

+1

@amatsuo_net,抱歉,我在发布我的答案后看到了您的评论。常识走向同一个方向。 –

你不能做的是,当该对象是因为一个数据帧的数据帧是相等长度的列表对象束。所以一个数据框基本上是一个格式化的列表!而你的输出要求列表项目的长度不一样。

因此,首先应该将数据帧lapply转换成一个列表,然后在列表中的项目:

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