2017-09-22 4 views
1

제 질문은 열 값과 고정 된 숫자 사이에 가장 가까운 값을 찾는 대신에 this one과 거의 같습니다. "2", 다른 열의 값에 가장 가까운 값을 찾고 싶습니다..df에있는 다른 두 열 사이의 가장 가까운 값을 찾는 것에 기초한 반환 값

df <- data.frame(site_no=c("01010500", "01010500", "01010500","02010500", "02010500", "02010500", "03010500", "03010500", "03010500"), 
        OBS=c(423.9969, 423.9969, 423.9969, 123, 123, 123, 150,150,150), 
        MOD=c(380,400,360,150,155,135,170,180,140), 
        HT=c(14,12,15,3,8,19,12,23,10)) 

다음과 같습니다 :

site_no  OBS MOD HT 
1 01010500 423.9969 380 14 
2 01010500 423.9969 400 12 
3 01010500 423.9969 360 15 
4 02010500 123.0000 150 3 
5 02010500 123.0000 155 8 
6 02010500 123.0000 135 19 
7 03010500 150.0000 170 12 
8 03010500 150.0000 180 23 
9 03010500 150.0000 140 10 

목표는 모든 "site_no"는 OBS 값과 일치하는 가장 가까운 MOD 값을 찾기 위해, 다음을 반환한다 다음은 데이터의 예 해당 HT. 예를 들어, site_no 01010500의 경우 423.9969 - 400은 최소 차이를 산출하므로 함수는 12를 반환합니다. 다른 게시물에서 대부분의 솔루션을 시도했지만 원자 벡터를 사용하여 $로 인해 오류가 발생합니다 (df는 재귀 적입니다. ,하지만 그 기능이 아닌 것 같아요). 나는 시도 : 일부 dplyr를 사용하여 :

ddply(df, .(site_no), function(z) { 
    z[abs(z$OBS - z$MOD) == min(abs(z$OBS - z$MOD)), ] 
}) 
Error in z$River_Width..m. - z$chan_width : 
    non-numeric argument to binary operator 
+0

아마도'라이브러리 (dplyr)와 data.frame로 변환 할 수 있습니다; % group_by (site_no) %> % slice (which.min (abs (OBS-MOD))) df %> % group_by (site_no) %> 슬라이스 (which.min (HT) ' – akrun

+0

@akrun, 두 번째 옵션은 훌륭하게 작동합니다. 당신이 하나로서 제출하면 대답으로 받아 들일 수 있습니다. 유일한 질문 : 반환되는 str은 tibble이며 일부 데이터 프레임의 조합입니다. 단일 데이터 프레임에서이 결과를 얻을 수 있습니까? – LauraR

+0

감사합니다. 내 설명을 약간의 설명과 함께 해결책으로 추가했습니다. 원하는 경우 data.frame으로 변환 할 수 있습니다. – akrun

답변

0

'site_no'로 그룹화 한 후, 우리는 'OBS'와 'MOD'

library(dplyr) 
res <- df %>% 
     group_by(site_no) %>% 
     slice(which.min(abs(OBS-MOD))) 

주 사이의 최소 절대 차이가 행을 slice 다른 대부분의 기능과 함께 작동해야하는 tbl_dftibble 등과 같은 추가 클래스가 추가되었습니다. 어떤 문제가있을 경우, 우리는 as.data.frame

str(res %>% 
     as.data.frame) 
#'data.frame': 3 obs. of 4 variables: 
#$ site_no: Factor w/ 3 levels "01010500","02010500",..: 1 2 3 
#$ OBS : num 424 123 150 
#$ MOD : num 400 135 140 
#$ HT  : num 12 19 10 
+0

이 경우 약간의 문제가 있습니다. 동점이 있으면 연산자가 인덱스의 첫 번째 값을 반환합니다. 이상적으로는 최대 (HT)를 반환하고 싶습니다. 이것을 슬라이스를 사용하여 작동시키지 못했습니다. 필터 및 순위로 이동하려고 시도했지만 그런 행운은 없습니다. – LauraR

+0

@LauraR 그 경우, 'df %> % group_by (site_no) %> % arrange (site_no, desc (HT)) %> % 슬라이스 (which.min (abs (OBS-MOD))' 'df $ MOD [5] <- 135'를 변경 한 후 – akrun

관련 문제