R中的过滤列表

时间:2015-09-04 09:20:14

标签: r list

我有一个清单

  A <- c(1,2,3,4,5,6,7,8,9,10)
  B <- c("a" ,"b", "c" ,"d","b" ,"f" ,"g" ,"a" ,"b" ,"a")
  C <- c(25, 26, 27, 28, 29, 30, 31, 32, 10, 15)
  mylist <- list(A,B,C)
  mylist  
  [[1]]
  [1]  1  2  3  4  5  6  7  8  9 10

  [[2]]
  [1] "a" "b" "c" "d" "b" "f" "g" "a" "b" "a" 

  [[3]]
  [1] 25 26 27 28 29 30 31 32 10 15

我想选择列表中的所有组件A,B,C,其中第二组件B具有值&#34; a&#34;或&#34; b&#34; 。

示例输出

  mylist  
  [[1]]
  [1]  1  2  6  8  9 10

  [[2]]
  [1] "a" "b" "b" "a" "b" "a" 

  [[3]]
  [1] 25 26 29 32 10 15

我该怎么做?请注意,每个组件具有相同的长度。

3 个答案:

答案 0 :(得分:4)

要坚持list,为什么不简单:

lapply(mylist, `[`, is.element(B, letters[1:2]))
#[[1]]
#[1]  1  2  5  8  9 10

#[[2]]
#[1] "a" "b" "b" "a" "b" "a"

#[[3]]
#[1] 25 26 29 32 10 15

答案 1 :(得分:3)

对于这个用例,我会使用data.frame或data.table:

使用原始列表(添加到A的10与B和C的条目数相同):

>df <- data.frame(A=mylist[[1]],B=mylist[[2]],C=mylist[[3]],stringsAsFactors=F)
> df[df$B %in% c("a","b"),]
    A B  C
1   1 a 25
2   2 b 26
5   5 b 29
8   8 a 32
9   9 b 10
10 10 a 15

这将对data.frame进行子集化,其中B值为a或b。如果您首先构建列表,则可以避免列表步骤并直接构建data.frame。

如果你真的想要一个清单:

> as.list(df[df$B %in% c("a","b"),])
$A
[1]  1  2  5  8  9 10

$B
[1] "a" "b" "b" "a" "b" "a"

$C
[1] 25 26 29 32 10 15

如果您想避开指定的条目,请使用unnameas.list(unname(df[..]))

答案 2 :(得分:0)

这是一个简单的解决方案。

首先,我创建了mylist:

  

mylist&lt; - list(1:10,字母[1:10],25:15)

然后我创建一个函数,如果条件为TRUE则返回TRUE,否则返回FALSE

> filt <- function(x) {
+   x[2] %in% c("a", "b")
+ }
> 

然后我使用sapply将函数应用于mylist,我只选择了我需要的组件:

> mylist[sapply(mylist, filt) == TRUE]
[[1]]
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"