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

Pav*_*nin 5 r list match

我有一份清单清单:

  pairs <- list(
    list(Name="A",Value=11), 
    list(Name="B",Value=17), 
    list(Name="C",Value=23)
  )
Run Code Online (Sandbox Code Playgroud)

如何检查该paris列表是否包含名称=="A"的元素?我也想得到那个元素.

bgo*_*dst 8

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

any(sapply(pairs,function(x) x$Name=='A'));
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)

如果您想要具有Name=='A'以下内容的列表组件数:

sum(sapply(pairs,function(x) x$Name=='A'));
## [1] 1
Run Code Online (Sandbox Code Playgroud)

如果您希望Value列表组件具有以下内容Name=='A':

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

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

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

如果你想要第一个内部列表Name=='A'(可以放弃,[1]如果你确定只有一个匹配):

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

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

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

以下是对应的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
Run Code Online (Sandbox Code Playgroud)