如何将包含NA的行合并为r中的一行?
这是我的数据:
data<-structure(c(1, NA, 2, NA, NA, 9), .Dim = 2:3, .Dimnames = list(
c("1", "2"), NULL), .Names = c("1", "2", NA, NA, NA, NA))
我每行都有 NA,但行彼此对应(如果一行有 NA,则同一列中的另一行有一个值)
[,1] [,2] [,3]
1 1 2 NA
2 NA NA 9
这是所需的输出:
[,1] [,2] [,3]
1 1 2 9
structure(c(1, 2, 9), .Dim = c(1L, 3L), .Dimnames = list("1",
NULL))
回答
严格假设NA
每一列的非值数量相同,可以这样做
t(apply(data, 2, na.omit))
# [,1] [,2] [,3]
# [1,] 1 2 9
t(..)
这个例子的需要是不同的,因为apply
这里将自动简化为向量,而不是数组。如果您的数据产生两个以上的非NA
值,那么您可以不用t(..)
:
data <- rbind(data, data)
data
# [,1] [,2] [,3]
# 1 1 2 NA
# 2 NA NA 9
# 1 1 2 NA
# 2 NA NA 9
apply(data, 2, na.omit)
# [,1] [,2] [,3]
# [1,] 1 2 9
# [2,] 1 2 9
@akrun 提出了一个很好的观点:如果一列是 all NA
,这将失败。这是一个轻微的修复:
apply(data, 2, function(z) { out <- na.omit(z); if (!length(out)) NA else out; })
# [,1] [,2] [,3]
# [1,] 1 2 9
# [2,] 1 2 9