我有一个清单
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
我该怎么做?请注意,每个组件具有相同的长度。
答案 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
如果您想避开指定的条目,请使用unname
:as.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"