11

我有一个矩阵 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?

4

3 回答 3

24

当然,你可以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
于 2014-09-11T00:39:30.960 回答
8

您的样本数据:

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))

要删除 NA:

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)))
于 2014-09-11T01:11:59.197 回答
4

你可以这样做:

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))
于 2014-09-11T00:38:46.963 回答