2017-10-18 1 views
-1

내 문제의 코드를 작성하는 데 도움이되는 팁이 있습니까? 단계적으로 몇 가지 문제를 해결할 수는 있지만 작업 속도를 높이기 위해 루프 작성 및 자체 기능부터 시작하는 방법을 알지 못합니다. 아래, 당신은 내가 끝낼 수있는 작은 데이터 세트로 인한 나의 마지막 문제를 볼 수있다. 그러나 문제는 내가 더 큰 데이터 세트를 가지고있을 때이다 (30 개 이상의 "diff"컬럼을 생성해야 할 때). 수동 프로세스 속도 향상 코드 작성 방법

는 시간 내 주셔서 감사합니다 :)

id=c(0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0) 
distance=c(43.59304, 152.66197, 208.00968, 272.92662, 380.79429, 
469.62269, 556.72725,734.29125, 796.42570, 873.09448, 1040.64550) 
c=data.frame(id,distance) 
c 
c[paste("diff",1:3, sep="")]=NA 
c$diff1=abs(c[c$id>0,][1,2]-c$distance) 
c$diff2=abs(c[c$id>0,][2,2]-c$distance) 
c$diff3=abs(c[c$id>0,][3,2]-c$distance) 
c 
c$min=apply(c[,c(3:5)], 1,FUN=min) 

편집 :

은 기본적으로 내가 ID와 각 지점에 대한 최단 거리를 계산하려면 = 0 ID = 1로 가장 가까운 점. 데이터 "거리"는 각 점에 대한 선을 따른 거리입니다.

Picture for better understening

+8

특정 문제를 설명해야하며, 디코드를 기대하지 말고, 변수'c'를 절대 사용하지 마십시오.) –

+0

@Moody_Mudskipper 주석도 추가하십시오. 질문에 대한 답변을 제공하기 위해 [최소한의 재현 가능한 완전한 예제] (http://stackoverflow.com/help/mcve)를 제공하면 도움을 줄 수 있습니다. 우리가 일하고 질문에 대답 할 수있는 방법을 보여주기 위해 사용할 수있는 것이 있습니다. 나는 [좋은 질문을합니까?] (https://stackoverflow.com/help/how)를 살펴볼 것을 권장합니다. -묻다). –

답변

0

중간에 그 부분은 두 개의 입력 벡터들의 각 쌍 (즉, 절대 차 함수) 함수를 적용 outer를 사용하여 수행 될 수있다.

따라서 @Moody_Mudskipper가 좋은 지적을했기 때문에 표기법을 변경했습니다. 변수 이름을 지정하지 마십시오. c.

열이 위치를 변경하는 경우를 대비하여 열 인덱스 대신 이름을 작성하여 명시 적으로 열을 참조하는 것이 더 좋습니다.

df <- structure(list(id = c(0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0), 
       distance = c(43.59304, 152.66197, 208.00968, 
           272.92662, 380.79429, 469.62269, 
           556.72725, 734.29125, 796.4257, 
           873.09448, 1040.6455)), 
      .Names = c("id", "distance"), 
      row.names = c(NA, -11L), 
      class = "data.frame") 

differences <- 
    outer(Y = df[df[["id"]] > 0, "distance"], X = df[, "distance"], FUN = function(x, y){ 
     abs(x - y) 
    }) 

differences <- as.data.frame(differences) 

names(differences) <- paste0("diff", seq_len(ncol(differences))) 

differences[["min"]] <- apply(differences, 1, min) 

cbind(df, differences) 

위와 같이 유연한 데이터이므로 더 많은 데이터를 처리 할 수 ​​있습니다. 니즈가 완전히 다르다면,보다 구체적이고 더 많은 정보를 공유하십시오.

+0

고마워,이 정확히 내가 원하는 것입니다 :) – user8795501