我有这个数据集:
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
答案 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