如何检查列表列表中的元素是否与条件匹配?

时间:2015-06-28 20:19:01

标签: r list match

我有一份清单清单:

  pairs <- list(
    list(Name="A",Value=11), 
    list(Name="B",Value=17), 
    list(Name="C",Value=23)
  )

如何检查paris列表是否包含名称为==&#34; A&#34;?的元素 而且我也想得到那个元素。

3 个答案:

答案 0 :(得分:8)

如果您只是想知道任何列表组件是否有Name=='A'

any(sapply(pairs,function(x) x$Name=='A'));
## [1] TRUE

如果您想要具有Name=='A'

的列表组件的数量
sum(sapply(pairs,function(x) x$Name=='A'));
## [1] 1

如果您希望列表组件的Value具有Name=='A'

unlist(lapply(pairs,function(x) if (x$Name=='A') x$Value));
## [1] 11

如果您想要具有Name=='A'的组件子列表:

pairs[sapply(pairs,function(x) x$Name=='A')];
## [[1]]
## [[1]]$Name
## [1] "A"
##
## [[1]]$Value
## [1] 11

如果您想要第一个包含Name=='A'的内部列表(如果您确定只有一个匹配项,则可以删除[1]):

pairs[[which(sapply(pairs,function(x) x$Name=='A'))[1]]];
## $Name
## [1] "A"
##
## $Value
## [1] 11

或者,由于您的数据似乎是常规数据,因此您可以转换为data.frame,这将简化所有这些操作:

df <- do.call(rbind,lapply(pairs,as.data.frame));
df;
##   Name Value
## 1    A    11
## 2    B    17
## 3    C    23

以下是df的等价物:

any(df$Name=='A');
## [1] TRUE
sum(df$Name=='A');
## [1] 1
df$Value[df$Name=='A'];
## [1] 11
subset(df,Name=='A');
##   Name Value
## 1    A    11
subset(df,Name=='A')[1,];
##   Name Value
## 1    A    11

答案 1 :(得分:4)

如果Filter list只有一个级别,则可以使用lists。这将返回所需的元素:

> Filter(function(u) u$Name=='A', pairs)
#[[1]]
#[[1]]$Name
#[1] "A"

#[[1]]$Value
#[1] 11

答案 2 :(得分:2)

您可以使用rlist

library(rlist)
list.filter(pairs, Name=='A')
#[[1]]
#[[1]]$Name
#[1] "A"

#[[1]]$Value
#[1] 11

另外,我原来的版本是

 sapply(pairs, function(x) x[grep('Name',names(x))]=='A') 
 # Name  Name  Name 
 # TRUE FALSE FALSE