2016-07-12 1 views
1

lapply 루프 내에서 행렬을 채우는 데 어려움이 있습니다.매트릭스에 행을 추가하는 Lapply

내 데이터에는 135 개의 지형 공간 점 목록이 있습니다. 루프에서 3 개의 다른 반경 내의 풍경을 기반으로 다양한 통계를 계산합니다. 내가하고 싶은 것은 135 사이트와 3 반지름의 각 조합을 순환 한 다음 빈, 미리 준비된 행렬의 각 행을 (사이트, 반경, metric1, metric2, metric3)로 채 웁니다.

나는 내가 달리고있는 문제를 복제하는 간단한 스크립트를 만들었습니다. 나는 아직 코드

# Generate empty matrix: 
mymatrix <- matrix(,nrow=18, ncol=5) 

# A vector with length of x (in my data this is the list of 135 sites): 
a <- 1:6 
#These sets will represent my metrics 
b <- rnorm(6, 5, 10) 
c <- rnorm(6, 100, 20) 
d <- rnorm(6, 20, 20) 

# Radius vector: 
rad <- c(100,200,300) 

# The loop: lapply for site within lapply for radius 
lapply(1:3,function(r){ 
    lapply(1:6,function(x){ 
    row.number <- (r-1)*6+x 
    tmpvector <- c(a[x], b[x], c[x], d[x], rad[r]) 
    mymatrix[row.number,] <- tmpvector 
    }) 
}) 
View(mymatrix) 

가 지금처럼 작성, 결과 행렬은 여전히 ​​비어 얼마나 ... 파악하지 않은 here 같이 나를 do.call(rbind, absdf) 명령을 적용하는 것이 가능합니다. 제가
mymatrix <- matrix(,nrow=18, ncol=5) 

a <- 1:6 
b <- rnorm(6, 5, 10) 
c <- rnorm(6, 100, 20) 
d <- rnorm(6, 20, 20) 

rad <- c(100,200,300) 

for (r in 1:3) { 
    for (x in 1:6) { 
    row.number <- (r-1)*6+x 
    tmpvector <- c(a[x], b[x], c[x], d[x], rad[r]) 
    mymatrix[row.number,] <- tmpvector 
    } 
} 
View(mymatrix) 

루프

으로하는 간단한 예를 쓰는 경우 I 예상대로

다음 행렬 값으로 채운다. 나는 간단한 실수를하는 경우 사과 : 나는이 루프에 아주 새롭다!

NB이 데이터의 연속 목록을 만드는데도 열어 두었습니다. 그러면이 데이터를보다 유용한 형식으로 변환 할 수 있습니다.

답변

0

당신이 정말로 그것을 (그리고 거의가 자신을했다) 할 여기 lapply으로 매우 추한 방법을 수행 할 경우

set.seed(123) 
#we don't really need to initialise the matrix anymore 
#mymatrix <- matrix(,nrow=18, ncol=5) 

a <- 1:6 
b <- rnorm(6, 5, 10) 
c <- rnorm(6, 100, 20) 
d <- rnorm(6, 20, 20) 
rad <- c(100,200,300) 

#Generate the list of rows: 
rowList<-lapply(1:3,function(r){ 
        lapply(1:6,function(x){ 
           #data processing 
           #row.number <- (r-1)*6+x #actually this line is unnecessary 
           tmpvector <- c(a[x], b[x], c[x], d[x], rad[r]) 
        }) 
}) 

#creation of mymatrix -- method 1 
mymatrix<-as.matrix(data.frame(rowList)) 
colnames(mymatrix)<-NULL #since you probably don't want the ugly output 
mymatrix<-t(mymatrix) 

### OR 
#creation of my matrix -- method2 (with do.call and rbind) 
do.call(rbind,sapply(rowList,matrix)) 

초기 접근 방식의 문제점 (예에 lapply 내의 행렬을 변경하려고하면 각 반복 끝에 마지막으로 작성한 결과가 반환됩니다. 즉, 현재 행이 작성되고 오류, 메시지 또는 경고가 작성되지 않았기 때문에 산출.

mymatrix는 모든 응용 프로그램이 {} 내부에서 처리 되었기 때문에 lapply 루프 이전과 동일하게 유지되며 저장되지도 않았습니다.

여러분이 lapply의 결과물로 무엇인가하고 싶다면, 객체에 저장해야합니다. (또는 다른 함수에 직접 연결해야합니다. 내부 논리가 마음에 들지 않으면 추천하지 않습니다. lapply).

희망, 나의 설명이 너무 복잡하지 않고 조금 주제에서 벗어난,하지만 좋은 장소로 시작하는 * 가족과 동등 적용 R Grouping functions: sapply vs. lapply vs. apply. vs. tapply vs. by vs. aggregate

1

lapply을 사용하면 매우 자연스럽지 않습니다. 그러한 행렬을 만들 때 루프가 필요 없으면 R의 재활용 특성을 사용할 수 있습니다.

mymatrix <- cbind(a, b, c, d, rep(c(100,200,300), each = 6)) 
+0

그것은 lapply 행렬을 만들 필요가 없습니다 것은 사실이다 내보기에서. 그러나 lapply는 데이터 프레임이나 매트릭스로 구성해야하는 출력을 생성하는 전체 스크립트에서 반복되는 지형 공간 처리 작업에 필요합니다. 솔직하게 말하면 목록을 만드는 것만으로도 충분할 것입니다. 그 목록을보다 유용한 형식으로 변환 할 수 있기 때문입니다. 귀하의 제안에 감사드립니다, @ 에드윈! – Nematode