【问题标题】:Remove NA from list of lists从列表列表中删除 NA
【发布时间】:2014-09-11 00:18:44
【问题描述】:

我有一个矩阵 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 的好方法?

【问题讨论】:

  • 不要使用像 list 这样的变量名,因为它在 R 中用于列表。
  • 好点。我通常不会——我只是想让它为示例通用。但记住这一点很好,因为我有时对命名约定很草率。

标签: r tapply


【解决方案1】:

当然,你可以像这样使用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

【讨论】:

  • 我怎样才能将所有 NA 替换为 0 而不是删除它们?
  • lapply(list, function(x) { x[is.na(x)] &lt;- 0; return(x) })(未测试)
【解决方案2】:

您的样本数据:

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

【讨论】:

  • 这种方法的好处是即使数据中没有NAs,它也会输出相同的list格式。
【解决方案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))

【讨论】:

  • 打败我吧 :)
  • lapply(split(data.mat, 1:nrow(data.mat)), function(x) unname(x[!is.na(x)])) 与“所需”输出有点相似,但两者都包含相同的信息。
  • @MrFlick 真的。我觉得unname 部分更好地匹配该方面并不感到羞耻,但您可能希望将您的部分作为单独的答案发布。或者,如果您不喜欢,我可以将其添加到我的。我没有羞耻心。 ;)
  • 就个人而言,我认为您的具体形状可能更有用且更能代表真实数据。我可以将其作为评论留下。
  • @tospig 是的,你需要前面的x。我不完全确定编辑发生了什么。我一定是搞错了。
猜你喜欢
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 2020-01-23
  • 2018-04-22
相关资源
最近更新 更多