2015-06-28 101 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

相關問題