我有一個列表的列表:如何檢查列表的元素是否與條件匹配?
pairs <- list(
list(Name="A",Value=11),
list(Name="B",Value=17),
list(Name="C",Value=23)
)
我如何檢查paris
列表中包含的元素有名稱==「A」? 而且我也想知道那個元素。
我有一個列表的列表:如何檢查列表的元素是否與條件匹配?
pairs <- list(
list(Name="A",Value=11),
list(Name="B",Value=17),
list(Name="C",Value=23)
)
我如何檢查paris
列表中包含的元素有名稱==「A」? 而且我也想知道那個元素。
如果你只是想知道任何列表組件是否有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
如果你可以簡單地使用Filter
您的lists
list
只有一個級別。這將返回所需的元素(S):
> Filter(function(u) u$Name=='A', pairs)
#[[1]]
#[[1]]$Name
#[1] "A"
#[[1]]$Value
#[1] 11
您可以使用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
,這似乎是一個很好的包。 –
@ColonelBeauvel包中有一些包裝函數。 – akrun
嘗試'sapply(對,函數(X) x [grep('Name',names(x))] =='A')' – akrun
@akrun x [grep(「Name」,names(x))]中的錯誤: 'symbol'類型的對象不是子集表 –
使用你的例子我得到'#Name Name Name TRUE FALSE FALSE'as result – akrun