2012-05-10 3 views
2

행렬 목록을 R로 작성했습니다. 목록의 모든 행렬에서 특정 색인의 행렬 요소 모음을 "제거"하고 싶습니다. 결장 운영자가 이것을 한 줄에 구현할 수 있다고 생각했습니다. 예를 들어, 다음 목록에있는 모든 행렬의 [1,1] 요소에 액세스하기위한 시도이다 ". 차원의 잘못된 번호"R 행렬 연산자가 행렬 목록에 있습니다.

myList = list() #list of matrices 
myList[[1]] = matrix(1:9, nrow=3, ncol=3, byrow=TRUE) #arbitrary data 
myList[[2]] = matrix(2:10, nrow=3, ncol=3, byrow=TRUE) 

#I expected the following line to output myList[[1]][1,1], myList[[2]][1,1] 
slice = myList[[1:2]][1,1] #prints error: "incorrect number of dimensions" 

위의 코드의 마지막 줄은 오류가 발생합니다

#assume myList has already been created (see the code snippet above) 
slice = c() 
for(x in 1:2) { 
    slice = c(slice, myList[[x]][1,1]) 
} 
#this works. slice = [1 2] 

사람이 한 줄에 위의 작업을 수행하는 방법을 알고 있나요 :

는 참고로, 여기에 내가 할 노력하고있어 실무 (미만 우아한) 구현입니까?

"매트릭스 목록"은 다른 것으로 대체 될 수 있습니다. 누군가가 위의 작업을 수행 할 수있는 대체 "매트릭스 모음"데이터 구조를 제안 할 수 있다면 해결 될 것입니다.

아마도이 질문은 어리석은 일입니다.하지만 정말 깨끗한 한 줄 구현을하고 싶습니다.

답변

4

두 가지. 첫째, [[[의 차이입니다. ?'['에서 관련 문장 :

사이의 가장 중요한 차이점 [[[와 $가 다른 두 단일 요소를 선택하는 반면이 [ 두 개 이상의 요소를 선택할 수 있다는 것입니다.

아마도 myList[1:2]을 원할 것입니다. 둘째, 설명하는 방식으로 하위 집합 연산을 결합 할 수 없습니다. myList[1:2]을 실행하면 두 행렬의 목록을 얻을 수 있습니다. 목록에는 대개 하나의 측정 기준 만 있기 때문에 myList[1:2][1,1]을 수행하는 것은 의미가 없습니다. (예외에 대한 설명을 참조하십시오.)

lapply(myList,'[',1,1) 대신 lapply을 시도해보십시오.

+0

... 색인 및 추출 요소를 쉽게 만들 것 . 예 : 'foo <- list (1,2,3,4); dim (foo) <- c (2,2); foo [1,2]; foo [[1,2]]'. 때때로 이것은 유용 할 수 있습니다. –

+0

@SachaEpskamp 잘 잡으세요. 명확하게 수정하겠습니다. – joran

+0

'myList [1 : 2] [1,1]'은 여전히 ​​무의미하지만'myList [1 : 2]'는 하나의 차원 만있는 목록을 반환합니다. :) –

2

이 작동 :

> sapply(myList,"[",1,1) 
[1] 1 2 

편집 : 오, 미안 해요, 내가 이전 대답의 끝으로 거의 같은 생각을 참조하십시오. 그러나 어쨌든 sapply는 원하는 것에 더 가까워 질 것입니다.

4

매트릭스의 치수가 모두 같으면 3 차원 어레이에 저장할 수 있습니다. 당신은 목록을 (희미`더 차원을 줄 수 있습니다)`: 그것은 확실히

## One way to get your data into an array 
a <- array(c(myList[[1]], myList[[2]]), dim=c(3,3,2)) 

## Extract the slice containing the upper left element of each matrix 
a[1,1,] 
# [1] 1 2 
"A 목록은 하나의 차원이있다"는 전혀 문제와 관련이없는,하지만 응답