从列表列表中删除NA

Amb*_*lis 10 r tapply

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

A B C D E  
45 43 45 65 23   
12 45 56 NA NA   
13 4  34 12 NA  
Run Code Online (Sandbox Code Playgroud)

我试图把它变成一个列表列表,其中每一行是一个更大的列表中的一个列表.我做以下事情:

list <- tapply(data.mat,rep(1:nrow(data.mat),ncol(data.mat)),function(i)i)
Run Code Online (Sandbox Code Playgroud)

这给了我一个包含NA的列表列表,例如:

$`1`  
 [1]  45 43 45 65 23  
$`2`  
 [1]  12 45 56 NA NA  
$`3`  
 [1]  13 4 34 12 NA  
Run Code Online (Sandbox Code Playgroud)

但我想要的是:

$`1`  
 [1]  45 43 45 65 23  
$`2`  
 [1]  12 45 56   
$`3`  
 [1]  13 4 34 12   
Run Code Online (Sandbox Code Playgroud)

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

rso*_*ren 21

当然,你可以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
Run Code Online (Sandbox Code Playgroud)


flo*_*del 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))
Run Code Online (Sandbox Code Playgroud)

按行拆分:

row.list <- split(data.mat, row(data.mat))
Run Code Online (Sandbox Code Playgroud)

删除NA:

Map(Filter, list(Negate(is.na)), row.list)
Run Code Online (Sandbox Code Playgroud)

要么

lapply(row.list, Filter, f = Negate(is.na))
Run Code Online (Sandbox Code Playgroud)

一拍一切:

Map(Filter, list(Negate(is.na)), split(data.mat, row(data.mat)))
Run Code Online (Sandbox Code Playgroud)