如何检查列表列表的元素是否符合条件?
How to check that element of a list of lists matches a condition?
我有一个列表列表:
pairs <- list(
list(Name="A",Value=11),
list(Name="B",Value=17),
list(Name="C",Value=23)
)
如何检查 pairs
列表是否包含 Name=="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
如果您的 list
或 lists
只有一级,您可以简单地使用 Filter
。这将 return 所需的元素:
> 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
我有一个列表列表:
pairs <- list(
list(Name="A",Value=11),
list(Name="B",Value=17),
list(Name="C",Value=23)
)
如何检查 pairs
列表是否包含 Name=="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
如果您的 list
或 lists
只有一级,您可以简单地使用 Filter
。这将 return 所需的元素:
> 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