从 R 中的列表中过滤值

Posted

技术标签:

【中文标题】从 R 中的列表中过滤值【英文标题】:Filter values from list in R 【发布时间】:2013-01-24 03:04:16 【问题描述】:

我想计算命名数字列表的平均值。我首先要删除 numeric(0) 值。另外,我想检索列表中的哪些元素包含numeric(0) 值。

以下是值的示例:

>r["gg",]

$`01_1_er`
   gg 
0.5176445 

$`02_1_er`
   gg 
0.4990959 

$`03_1_er`
   gg 
0.5691489 

$`22_1_er`
numeric(0)

$`23_1_er`
numeric(0)

$`25_1_er`
  gg 
0.386304 

这是str的结果:

> str(r["gg",])
List of 6
 $ 01_1_er: Named num 0.518
  ..- attr(*, "names")= chr "gg"
 $ 02_1_er: Named num 0.499
  ..- attr(*, "names")= chr "gg"
 $ 03_1_er: Named num 0.569
  ..- attr(*, "names")= chr "gg"
 $ 22_1_er: num(0) 
 $ 23_1_er: num(0) 
 $ 25_1_er: Named num 0.386
  ..- attr(*, "names")= chr "gg"

谁能帮忙?

【问题讨论】:

mean(unlist(r["gg",])) 【参考方案1】:

使用基础 R 中的Filter 函数的另一种解决方案:

mean(unlist(Filter(is.numeric, l)))

【讨论】:

Filter() 功能很棒。这似乎应该是公认的答案。 谢谢,R 文档真的很混乱,有很多来自不同包的过滤器函数,你找不到基本语言 rdocumentation.org/search?q=Filter 的那个。也许应该有只针对该语言的文档,而不是每个可能的库。【参考方案2】:
## Example list

l <- list(n1=numeric(0), n2="foo", n3=numeric(0), n4=1:5)

## Filter out elements with length 0

l[lapply(l, length) > 0]


$n2
[1] "foo"

$n4
[1] 1 2 3 4 5


## Get names of elements with length 0

names(l)[lapply(l, length) == 0]

[1] "n1" "n3"

【讨论】:

我真的很喜欢这个解决方案。但我也必须按照詹姆斯的建议来计算平均值。我认为您的两个答案的组合将起作用。【参考方案3】:

取消列出将仅提取单个向量中的数字条目,您可以将其称为均值,因此请尝试:

mean(unlist(r["gg",]))

【讨论】:

进一步搜索导致我得到类似的答案。但是我没有得到原始名称,也没有得到删除的元素。我认为您和 juba'a 答案的结合将解决我的问题。

以上是关于从 R 中的列表中过滤值的主要内容,如果未能解决你的问题,请参考以下文章

从数组值中过滤字典

从列表中的每个值中选择前 10 个元素

从下拉列表 Select2 中的多个值中获取选定值

按 R 中的列值过滤列表中的每个数据框

如何在 R 中迭代地过滤列表中的列表或如何同时使用两个条件过滤 data.table,在运行时创建对象

如何从 R 中的 ngram 标记列表中有效地删除停用词