2012-08-28 5 views
1

목록의 각 요소에 함수를 적용하는 것에 대한 질문이 있습니다. 여기 목록의 각 요소에 대해 별도로 함수 적용

내 문제입니다 : 내가 DF의 목록을 가지고

(나는 일에 의해 더 큰 DF 분할) :이 동일하다면

mydf <- data.frame(x=c(1:5), y=c(21:25),z=rnorm(1:5)) 
mylist <- rep(list(mydf),5) 
names(mylist) <-c("2006-01-01","2006-01-02","2006-01-03","2006-01-04","2006-01-05") 

이 가짜 데이터에 대한 상관 없어), 그것은 단지 예를 들어. 목록의 각 DF에 대한 열 "z"와 일부 공간 좌표를 나타내는 "x"및 "y"2 개의 다른 열을 결과로 나타냅니다.

내가 서로 독립적 DF 어떤 특정 지역을 나타내는도 "X"및 "Y"의리스트를 포함하는이 (10 개 영역 상상)

최종 목표는 각각 10 개 영역에 대해 갖는 것이다
region <- data.frame(x=c(1:10),y=c(21:30),region=c(1:10)) 

, 내 목록의 각 DF의 가장 가까운 지점 (좌표에 따라)에서 값 "z"(내 결과 중). 하나 개의 영역 수단 10 결과 DF2 행 내에서, 다음 (10) 다른 결과 "Z"의 DF1에서 "Z"는 ... 내 최종 DF 가능한 경우 (구조에 대해) 다음과 같이 표시한다 :

final1 <- data.frame("2006-01-01"=rnorm(1:10),"2006-02-01"=rnorm(1:10), 
"2006-03-01"=rnorm(1:10),"2006-04-01"=rnorm(1:10),"2006-05-01"=rnorm(1:10)) 

1 일의 열 (목록의 한 DF)과 각 행에 대해 하나의 값 (예 : 2006-01-01의 경우 : 첫 번째 영역과 가장 가까운 지점의 값 "z"). 내가 원하는 것을 가지고 루프를 만들기 위해 노력하고, 그런 다음

min.dist <- function(p, coord){ 
    which.min(colSums((t(coord) - p)^2)) 
} 

을,하지만 난 목록 어려움이 있습니다

은 이미 가장 가까운 값을 찾기 위해 작은 기능을 가지고있다. 루프에 2 개의 변수를 넣어야하지만 작동하지 않습니다.

이 난 그냥 내 목록의 1 DF를 가지고가는 경우에 약 작동합니다

for (j in 1:nrow(region)){ 

imin <- min.dist(c(region[j,1],region[j,2]),mylist[[1]][,1:2]) 
imin[j] <- min.dist(c(region[j,1],region[j,2]),mylist[[1]][,1:2]) 
final <- mylist[[1]][imin[j], "z"] 
final[j] <- mylist[[1]][imin[j], "z"] 
final <- as.data.frame(final) 
} 

을하지만 위해 내가 개체의 목록의 각 DF에 대한 결과 중 하나가 열이 내 전체 목록을 (선택하는 경우 " 최종 "), 나는 오류가 있습니다.

첫 번째 문제는 "regions"의 길이가 내 목록의 길이와 다르다는 것이고 두 번째 것은 내 목록의 길이에 두 번째 변수를 추가하는 것입니다. 루프에 익숙하지 않아 2 변수 루프가 있습니다.

내가 찾고있는 것을 바꾸려면 무엇을 변경해야하는지 루프에서 변경할 수 있도록 도와 주시겠습니까?

대단히 감사합니다!

+0

'plante'와 'region'이 정의되지 않았습니다. 제발, 작동 예제를 만듭니다. – Pop

+0

지역은 내 게시물의 시작 부분에 정의됩니다. 심는 경우 실수예요. 나는 그것을 루프에서 바꿨다. 이 루프는 내 문제가이 루프에 있기 때문에 실제로 복제 할 수 없습니다. 그것은 내가하려고하는 것을 보여주기위한 것입니다.어쩌면 거기에 가장 쉬운 방법이있을 수 있습니다. 또는이 루프를 개선해야하지만 R 지식으로는 할 수 없습니다. – jeff6868

답변

5

lapply()를 사용하여 목록에 함수를 적용 할 수 있습니다.

이렇게하면됩니다. 벡터 목록을 반환합니다.

lapply(
    mylist, 
    FUN = function(mydf) 
    mydf[apply(
     region[, -3], 
     1, 
     FUN = function(x) 
     which.min(apply(
      mydf[, -3], 
      1, 
      FUN = function(y) 
      dist(rbind(x, y)) 
     )) 
    ), 3] 
) 
관련 문제