2017-06-12 61 views
0

我有這樣的數據集:刪除「細胞」與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,抱歉,我在發佈我的答案後看到了您的評論。常識走向同一個方向。 –

回答

2

你不能做的是,當該對象是因爲一個數據幀的數據幀是相等長度的列表對象束。所以一個數據框基本上是一個格式化的列表!而你的輸出要求列表項目的長度不一樣。

因此,首先應該將數據幀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