从列表列表中删除NA

时间:2014-09-11 00:18:44

标签: r tapply

我有一个矩阵data.mat,它看起来像:

A B C D E  
45 43 45 65 23   
12 45 56 NA NA   
13 4  34 12 NA  

我正在尝试将其转换为列表列表,其中每行是较大列表中的一个列表。我做了以下事情:

list <- tapply(data.mat,rep(1:nrow(data.mat),ncol(data.mat)),function(i)i)

它给出了一个包含NA的列表列表,例如:

$`1`  
 [1]  45 43 45 65 23  
$`2`  
 [1]  12 45 56 NA NA  
$`3`  
 [1]  13 4 34 12 NA  

但我想要的是:

$`1`  
 [1]  45 43 45 65 23  
$`2`  
 [1]  12 45 56   
$`3`  
 [1]  13 4 34 12   

在tapply通话期间或之后是否有一种很好的方法可以删除NA?

3 个答案:

答案 0 :(得分:20)

当然,您可以像这样使用lapply

> lapply(list, function(x) x[!is.na(x)])
$`1`
[1] 45 43 45 65 23

$`2`
[1] 12 45 56

$`3`
[1] 13  4 34 12

答案 1 :(得分:6)

您的样本数据:

data.mat <- data.matrix(read.table(text = "A B C D E  
45 43 45 65 23   
12 45 56 NA NA   
13 4  34 12 NA ", header = TRUE))

按行分割:

row.list <- split(data.mat, row(data.mat))

删除NAs:

Map(Filter, list(Negate(is.na)), row.list)

lapply(row.list, Filter, f = Negate(is.na))

一步到位:

Map(Filter, list(Negate(is.na)), split(data.mat, row(data.mat)))

答案 2 :(得分:3)

你可以这样做:

apply(data.mat, 1, function(x) x[!is.na(x)])

输出:

[[1]]
 A  B  C  D  E 
45 43 45 65 23 

[[2]]
 A  B  C 
12 45 56 

[[3]]
 A  B  C  D 
13  4 34 12

如果你不想要名字:

apply(data.mat, 1, function(x) unname(x[!is.na(x)]))

如果每行都有相同数量的NA,则使用起来会更安全:

split(apply(data.mat, 1, function(x) unname(x[!is.na(x)])), 1:nrow(data.mat))