2017-10-26 11 views
0

각 안에 각각 에 대해 SiteID의 최소값은 무엇입니까?R 최소 x를 2 개 그룹으로 찾으십시오.

이 나는 ​​시도했다 :

ds_DT <- ds_fish[ , .SD[which.min(DSSite_Dis)], by = c("SiteID", "year")] 

그러나 SiteIDyear는 다른 길이 있습니다.

year을 반복하여 SiteID 내에서 반복하여 내 머리를 감길 수 없습니다. which.mindata.table이지만 다른 용도로 사용하기 편리합니다.

간단한 루핑 질문 인 경우 사과드립니다.

+1

넌 [재현성 예]을 제공한다 (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-에 예제)를 샘플 입력과 해당 입력에 대한 원하는 출력과 비교하여 가능한 솔루션을 테스트하고 검증 할 수 있습니다. – MrFlick

답변

3

SiteIDyear 길이가 아닙니다. 잘 ds_fish[ , uniqueN(SiteID)]ds_fish[ , uniqueN(year)] 상이한하는 경우 일 수 있지만 data.tableds_fish의 특성함으로써, length(ds_fish$SiteID) == length(ds_fish$year)이 (결국 모두 nrow(ds_fish) 동일하다)되는 경우이어야한다.

제공하신 코드가 원하는 것입니다. 여기에 당신이 원하는 무엇을 : 당신이 무슨 짓을했는지

ds_fish[ , .(min_site_dis = min(DSSite_Dis)), by = .(SiteID, year)] 

각 최소한의 DSSite_Dis에 대한 에게 전체 관찰을 반환 - 이것은뿐만 아니라 최소한의 DSSite_Dis를 반환하지만 것 ds_fish의 나머지 열에서의도 값 행은 이러한 최소치에 해당합니다.

당신이 씹을에 대한 개념적 주 - 후 "각 year 내의 각 SiteID의 최소 DSSite_Dis"로하는지 말로 표현; 각 year 내 최소 DISSite_Dis과 같음을 확인하십시오. SiteID.

0

원본 코드가 작동합니다. 여기

는 전체

library(foreign) 
library(data.table) 

file <- 'DownstreamSites.dbf' # ds_fish dbf 
ds_fish <- read.dbf(file, as.is = FALSE) 
file <- 'UpstreamSites.dbf' # nearest_us_fish dbf 
us_fish <- read.dbf(file, as.is = FALSE) 
file <- 'barriers.dbf' # barriers dbf 
barriers <- read.dbf(file, as.is = FALSE) 
file <- 'metrics.dbf' # barriers dbf 
metrics <- read.dbf(file, as.is = FALSE) 
metrics <- metrics[c(-1:-3,-8:-34,-41,-42,-45:-47,-49:-52)] 

colnames(metrics)[13] <- "DSSite_ID" 
ds_fish1 <- merge(metrics, ds_fish, by = 'DSSite_ID') 
colnames(metrics)[13] <- "USSite_ID" 
us_fish1 <- merge(metrics, us_fish, by = 'USSite_ID') 

year <- format(as.Date(us_fish1$event_date, format="%d/%m/%Y"),"%Y") 
us_fish1$year <- year 
year <- format(as.Date(ds_fish1$event_date, format="%d/%m/%Y"),"%Y") 
ds_fish1$year <- year 

ds_fish2 <- data.table(ds_fish1) 
us_fish2 <- data.table(us_fish1) 

ds_DT <- ds_fish2[ , .SD[which.min(DSSite_Dis)], by = c("SiteID", "year")] 
us_DT <- us_fish2[ , .SD[which.min(USSite_Dis)], by = c("SiteID", "year")]