2013-07-18 4 views
4

data.table에 대한 설명을 듣고 자 노력하고 있지만 의견을 물어보고 싶습니다.R : data.table에서 열의 범위 선택

(1) 새로운 data.table을 생성하기 위해 data.table에서 다양한 범위의 열을 선택하고 싶습니다.

(2) 또한 각 그룹의 첫 번째 값을 가져오고 싶습니다. 첫 번째 질문에 관해서는 대답이 here으로 주어진다 고 생각합니다. 그런 다음 열 번호와 관련이 있습니다. 그러나 필자는 data.table의 주요 장점 (및 판매 포인트) 중 하나라고 생각하는 열 이름을 사용하고 싶습니다.

다음은 데이터 세트의 예입니다.

DT <- data.table(ID=c(101,101,101,102,103,104,104), 
       "year.1" = c(1,5,3,2,3,4,8), 
       "year.2" = c(4,5,6,NA,1,2,3), 
       "year.3" = c(1,2,3,7,9,8,0), 
       "year.4" = c(4,5,NA,1,2,6,9)) 
setkey(DT,ID) 

실제로 나는 "연도"뿐만 아니라 훨씬 더 많은 열을 가지고 있습니다. 두 번째 질문에 대한

# ALL OF THESE DONT WORK AND END IN ERRORS 
# To extract a range of columns I have tried this: 
dt.sub <- DT[,list(year.1:year.3,ID)] 
dt.sub <- DT[,c("year.1":"year.3",ID), with=FALSE] # I know shouldn't work since 
# "with=FALSE" is only intended in combination with := according to the documentation 
dt.sub <- DT[,lapply(SD),.SDcols= for (i in 1:3) paste0("year.",i) ] 

: 나는 각 그룹의 첫 번째 관찰을 포함 dt.sub 싶다면, 본인은 "멀티 포트"인수를 사용할 수 있다고 기대. 그러나 이것은 내가 예상하는 것보다 다른 방식으로 에서 작동합니다. 단 하나의 열에 예제를 사용하면 :

dt.sub1 <- DT[,year.1, by=ID,mult="first",] 

이것은 오류를 제공하지 않지만 그룹의 첫 번째 줄만 제공하는 것은 아닙니다.

dt.sub1 <- unique(DT[,year.1, by=ID]) 

가 예상되는 출력을 제공 않습니다,하지만 난 mult 옵션 중요한 뭔가를 놓친 거지 같은 느낌 : 나는 해결 방법 같은 것을 알고있다. 병합/이 data.tables에 가입하고 일치하는 항목이 여러 개 존재할 때 무엇을 의미 할 때

+0

안녕 아룬, 그것은 명확하게 만드는, 편집 주셔서 감사합니다! – Richard

+0

'v1.9.5' 이래로'dt.sub-DT [, c ("year.1": "year.3", ID), = FALSE]'로 작동합니다. [here] (https://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.html)를 참조하십시오. –

답변

7
# (1) 
DT[, c(paste0('year.', 1:3), 'ID'), with = F] 

# (2) 
DT[, year.1[1], by = ID] 

mult 사용됩니다. @Arun 지적 따라서, 당신의 두번째 질문에 대한 mult를 사용하는 방법은 (이미 ID에 의해 키가 있습니다 주어진) 될 것이다 :

DT[J(unique(ID)), list(ID, year.1), mult = 'first'] 
+0

답변 해 주셔서 감사합니다. 가장 도움이됩니다. – Richard