2012-06-14 7 views
0
A = data.frame(a = c(1:10), b = c(11:20)) 
B = data.frame(a = c(101:110), b = c(111:120)) 
C = data.frame(a = c(5:8), b = c(55:58)) 

L = list(list(B), list(A,C), list(B,C,A), list(B,C)) 

InputList = InputList = list(c(0.9,0.8),c(0.98,0.5),c(1, 1),c(1.5,1.2)) 

두 개의 목록 L (벡터 목록)과 InputList (데이터 프레임 목록 목록)가 있습니다. 목록 L에서 벡터 (1,1)의 위치를 ​​검색하고 InputList에서 데이터 프레임의 해당 목록을 반환해야합니다.목록 및 데이터 프레임 목록 목록 조작

예를 들어 벡터 (1,1)은 Inputlist의 세 번째 요소이므로 L 목록 (B, C, A)에서 세 번째 데이터 프레임 목록을 반환해야합니다.

답변

0
test<-mapply(function(x,y){paste(x,collapse="~")==y},InputList,paste(c(1,1),collapse="~")) 
L[test] 
2

테스트 벡터를 정의하는 방법이 있다고 가정합니다. 귀하의 예에서는 c(1, 1)을 사용했습니다.

test_vector <- c(1, 1) 

원하는 기능을 정의하십시오. InputList의 값이 test_vector과 같으면 인덱스 x과 일치하는 L의 요소를 반환합니다.

myfun <- function(x, test_vec=test_vector) { 
    if(identical(InputList[[x]], test_vec)) { 
    return(L[[x]]) 
    } 
} 

out <- lapply(seq_along(InputList), myfun) 

그러나 일치하지 않는 부분은 NULL입니다. 아래 단계는 목록에서 NULL을 제거합니다.

> out[!sapply(out, is.null)] 
[[1]] 
[[1]][[1]] 
    a b 
1 101 111 
2 102 112 
3 103 113 
4 104 114 
5 105 115 
6 106 116 
7 107 117 
8 108 118 
9 109 119 
10 110 120 

[[1]][[2]] 
    a b 
1 5 55 
2 6 56 
3 7 57 
4 8 58 

[[1]][[3]] 
    a b 
1 1 11 
2 2 12 
3 3 13 
4 4 14 
5 5 15 
6 6 16 
7 7 17 
8 8 18 
9 9 19 
10 10 20 
+0

그 all.equal' '로 변경해야합니다. '동일'하고 떠 다니는 문제가 생길 수 있습니다. – Justin