제 질문은 열 값과 고정 된 숫자 사이에 가장 가까운 값을 찾는 대신에 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
아마도'라이브러리 (dplyr)와 data.frame로 변환 할 수 있습니다; % group_by (site_no) %> % slice (which.min (abs (OBS-MOD))) df %> % group_by (site_no) %> 슬라이스 (which.min (HT) ' – akrun
@akrun, 두 번째 옵션은 훌륭하게 작동합니다. 당신이 하나로서 제출하면 대답으로 받아 들일 수 있습니다. 유일한 질문 : 반환되는 str은 tibble이며 일부 데이터 프레임의 조합입니다. 단일 데이터 프레임에서이 결과를 얻을 수 있습니까? – LauraR
감사합니다. 내 설명을 약간의 설명과 함께 해결책으로 추가했습니다. 원하는 경우 data.frame으로 변환 할 수 있습니다. – akrun