2015-06-28 72 views
3

我有一个列表的列表:如何检查列表的元素是否与条件匹配?

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

我如何检查paris列表中包含的元素有名称==“A”? 而且我也想知道那个元素。

+0

尝试'sapply(对,函数(X) x [grep('Name',names(x))] =='A')' – akrun

+0

@akrun x [grep(“Name”,names(x))]中的错误: 'symbol'类型的对象不是子集表 –

+0

使用你的例子我得到'#Name Name Name TRUE FALSE FALSE'as result – akrun

回答

7

如果你只是想知道任何列表组件是否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 
4

如果你可以简单地使用Filter您的listslist只有一个级别。这将返回所需的元素(S):

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

#[[1]]$Value 
#[1] 11 
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 
+0

,这似乎是一个很好的包。 –

+0

@ColonelBeauvel包中有一些包装函数。 – akrun

相关问题