2016-09-28 4 views
2

data.table을 사용하여 많은 수의 변수로 여러 변수를 표준화 할 수 있습니까?data.table을 사용하여 그룹별로 표준화

DT <- data.table(V1=1:20, V2=40:21, gr=c(rep(c('a'),10), rep(c('b'),10)), 
      grr=rep(c(rep(c('a'),5), rep(c('b'),5)),2)) 
gr 및 grr은 그룹 변수입니다. 각 gr-by-grr 그룹 내의 표준화 된 점수 인 data.table V1.z 및 V2.z를 추가하려고합니다.

DTaa <- DT[gr=='a' & grr=='a',] 
DTab <- DT[gr=='a' & grr=='b',] 
DTba <- DT[gr=='b' & grr=='a',] 
DTbb <- DT[gr=='b' & grr=='b',] 
DTaa <- DTaa[,V1.z := scale(V1)] 
DTaa <- DTaa[,V2.z := scale(V2)] 
DTab <- DTab[,V1.z := scale(V1)] 
DTab <- DTab[,V2.z := scale(V2)] 
DTba <- DTba[,V1.z := scale(V1)] 
DTba <- DTba[,V2.z := scale(V2)] 
DTbb <- DTbb[,V1.z := scale(V1)] 
DTbb <- DTbb[,V2.z := scale(V2)] 
DTn <- rbind(DTaa, DTab, DTba, DTbb) 

것은 아마, 하나 개 또는 두 개의 라인 by를 사용하여 할 수있는 방법이있다 :

여기에 내가 원하는 것을 설명하는 그것에 대해 매우 바보 같은 코드입니다.

  • 데이터, 대상 변수 (예 : V1 및 V2) 및 그룹 변수 (예 : gr 및 grr)를 인수로 받아들이는 함수에서 사용하고 싶습니다.
  • data.table을 사용하지 않는 솔루션을 사용하는 경우 dplyr에서 mutate_at를 사용해 보았지만 그 기능에 대한 많은 문서를 찾을 수 없었습니다.

답변

3

'GR'및 'GRR'Data.table들의 서브셋 (.SD) 위에 루프 scale 그것 (scale의 출력이 matrix 그래서 우리는 as.vectorvector으로 변환)에 의해 그룹화 한 후 새 열에 출력을 할당하십시오 (:=).

DT[, paste0(names(DT)[1:2], ".z") := lapply(.SD, 
        function(x) as.vector(scale(x))), .(gr, grr)] 
+0

@YBA 귀하에게 도움이된다는 소식입니다. 또한 [여기] (http://stackoverflow.com/help/someone-answers) – akrun

+0

놀라운 가이드 라인을 읽어보십시오. 감사. 후속 질문 : V3 및 V4를 data.table에 추가했는데 코드가 처음 두 변수 만 변환하는 것을 여전히 알고있었습니다. 좋습니다.하지만 어떻게 작동 했습니까? 내 말은, data.table은 첫 번째와 두 번째 열에 대해서만 수행 할 작업을 원한다는 것을 어떻게 알 수 있습니까? 여기에서 볼 수있는 것은 paste0에 있지만, 이는 새로운 변수의 이름 일뿐입니다. 1 열과 2 열의 이름을 사용하고 3 열과 4 열에 작업을 수행하려면 어떻게해야합니까? – YBA

+0

@YBA 일반적으로'.SD'에는'by '열에 지정되지 않은 모든 열, 즉'(gr, grr)'이 포함됩니다. 다른 컬럼을 가지고 있고 'V1'과 'V2'만하고, '.SDcols'즉 '.SDcols = V1 : V2'에 지정하고'.SD'를 반복하면 다음과 같이됩니다. 게시물. – akrun

관련 문제