2017-12-14 24 views
2

많은 열이있는 매우 큰 데이터 집합이 있습니다. 이 데이터를 집계하고 각 열 집합에 다른 기능을 수행해야합니다. 필자는 많은 열을 가지고 있으므로 집계의 각 열과 함께 사용할 각 함수를 수동으로 지정하는 것이 번거로울 수 있습니다. data.table으로 집계하는 방법에 대한 많은 게시물을 읽었지만 아무도이 상황을 처리하지 못하는 것 같습니다.Data.table을 사용하여 큰 데이터 테이블에서 다른 수식의 여러 열 집계 r

mpg 데이터 세트로 작업을 할 수 있습니다. cyltrans으로 집계하고 싶습니다. ctyhwy 열의 평균을 반환하고 싶지만 첫 번째 값은 manufacturermodel에서 반환하고 싶습니다. 실제로 나는 cols<-names(data)[10:50].SDcols=cols을 지정하여 더 많은 열에 적용 할 것입니다. 개별적으로 각 열 집합을 처리하고 나중에 데이터를 병합 할 수 있지만 수십 개의 서로 다른 열 그룹이있을 때도 혼란스러워집니다. data.table으로 더 좋은 방법이 있어야한다고 생각합니다.

require("data.table") 
require("ggplot2") #for the mpg dataset 
dat1<-data.table(mpg) 
perf<-dat1[, lapply(.SD, ave), .SDcols=c("cty","hwy"), by=list(cyl,trans)] #Aggregate performance data. 
info<-dat1[, lapply(.SD, first), .SDcols=c("manufacturer","model"), by=list(cyl,trans)] #Aggregate model data. 
perf[info, on=list(cyl,trans)] #Merge data 

> head(perf[info, on=list(cyl,trans)]) 
    cyl  trans cty hwy manufacturer model 
1: 4 auto(l5) 6 6   audi a4 
2: 4 manual(m5) 33 33   audi a4 
3: 4 manual(m6) 7 7   audi a4 
4: 4 auto(av) 2 2   audi a4 
5: 6 auto(l5) 16 16   audi a4 
6: 6 manual(m5) 18 18   audi a4 

질문

어떻게 1 개 동작 위를 수행 할 수 있습니다? 내가 생각하는 것은 각 그룹을 부분 집합하고 다음과 같은 일을하는 것이다. 어쩌면 조금 과장 할 지 모르겠지만, 나는 추측할만한 별을 쏘고있다.

dat1[, .(names(group1)=lapply(group1, ave),names(group2)=lapply(group2, first)), by=list(cyl,trans)] 

답변

4
group1 = c("cty", "hwy") 
group2 = c("manufacturer", "model") 

dat1[, c(
    lapply(.SD[, ..group1], mean), 
    lapply(.SD[, ..group2], first) 
), by=.(cyl, trans)] 

는`mean`가 아닌`ave`입니다

cyl  trans  cty  hwy manufacturer    model 
1: 4 auto(l5) 20.33333 31.00000   audi     a4 
2: 4 manual(m5) 21.54545 29.27273   audi     a4 
3: 4 manual(m6) 21.00000 29.57143   audi     a4 
4: 4 auto(av) 22.00000 30.50000   audi     a4 
5: 6 auto(l5) 15.18750 21.43750   audi     a4 
6: 6 manual(m5) 16.66667 22.66667   audi     a4 
7: 6 auto(av) 18.66667 26.00000   audi     a4 
8: 4 auto(s6) 20.50000 28.25000   audi   a4 quattro 
9: 6 auto(s6) 17.40000 26.00000   audi   a4 quattro 
10: 6 manual(m6) 16.00000 22.60000   audi   a4 quattro 
11: 8 auto(s6) 13.60000 20.40000   audi   a6 quattro 
12: 8 auto(l4) 12.20000 16.73333 chevrolet c1500 suburban 2wd 
13: 8 manual(m6) 13.42857 20.00000 chevrolet   corvette 
14: 4 auto(l4) 20.50000 27.62500 chevrolet    malibu 
15: 6 auto(l4) 16.03448 22.68966 chevrolet    malibu 
16: 4 auto(l3) 21.00000 27.00000  dodge  caravan 2wd 
17: 6 auto(l6) 16.00000 23.00000  dodge  caravan 2wd 
18: 8 auto(l5) 12.29412 16.41176  dodge dakota pickup 4wd 
19: 8 manual(m5) 13.00000 18.80000  dodge dakota pickup 4wd 
20: 8 auto(l6) 12.50000 18.50000   ford  expedition 2wd 
21: 8 auto(s5) 12.00000 18.00000  nissan  pathfinder 4wd 
22: 8 auto(s4) 16.00000 25.00000  pontiac   grand prix 
23: 4 auto(s4) 20.00000 26.00000  subaru  impreza awd 
24: 4 auto(s5) 22.00000 31.00000  toyota  camry solara 
25: 6 auto(s5) 18.00000 27.00000  toyota  camry solara 
26: 5 auto(s6) 20.50000 29.00000 volkswagen    jetta 
27: 5 manual(m5) 20.50000 28.50000 volkswagen    jetta 
    cyl  trans  cty  hwy manufacturer    model 
+0

내가 연구에서 평균을내어 기능 때문에 OP는 다른 결과를 제공합니다. – Frank

+1

환상적인 답변입니다. 'ave'에 대한 정정을 보내 주셔서 감사 드리며, 그것이 바로 워크 플로우를 엑셀과 믹싱하는 것입니다. – CCurtis