2014-04-04 4 views
1

두 개의 목록이 있으며 다른 목록을 사용하여 목록의 데이터를 부분 집합으로 만들고 싶습니다.다른 목록을 사용하여 목록의 하위 집합을 만드는 방법은 무엇입니까?

mylist <- list(a = data.frame(cola = 1:3, colb = 4:6), 
      b = data.frame(cola = 1:3, colb = 6:8)) 
> mylist 
$a 
    cola colb 
1 1 4 
2 2 5 
3 3 6 

$b 
    cola colb 
1 1 6 
2 2 7 
3 3 8 

> 

hislist <- list(a = 5:6, 
       b = 7:8) 

> hislist 
$a 
[1] 5 6 

$b 
[1] 7 8 

hislist 내가 lapply 기능을 사용하여 myList에 부분 집합을 시도 :

lapply(mylist, function(x) subset(x, colb %in% hislist)) 
#or 
lapply(mylist, function(x) x[x$colb %in% hislist,]) 

그러나이 작동하지 않는 말, 나는 mylisthislist라는 목록이 있습니다. 이 문제를 해결하는 방법?

답변

4

가장 간단한 해결책은 mapply을 사용하는 것입니다

mapply(function(x, y) x[x[, 2] %in% y,], mylist, hislist, SIMPLIFY=FALSE) 
# $a 
# cola colb 
# 2 2 5 
# 3 3 6 
# 
# $b 
# cola colb 
# 2 2 7 
# 3 3 8 

이 기능은 당신이 당신의 현재 lapply 접근 방식에서 사용하는 것보다 훨씬 다르지 않다.

+0

예, 이것이 올바른 결과를주는 것 같습니다! – jrara

1

예를 들어 hislist에 unlist를 사용하면 값의 벡터가됩니다. 내가 생각할 수있는

lapply(mylist, function(x) x[x$colb %in% unlist(hislist),]) 
$a 
    cola colb 
2 2 5 
3 3 6 

$b 
    cola colb 
2 2 11 
3 3 12 
+0

mylist (a와 b)에 동일한 값이있을 때 uncorrect 결과를 내기 때문에 미안하지만, 나는 unlist를 사용하지 않을 것입니다. – jrara

관련 문제