2017-05-10 3 views
1

I는 데이터 프레임의 두 세트가 상기 제 1 세트와 같다 :R에있는 평균과 다른 벡터를 기반으로 데이터 프레임을 재주문하는 방법은 무엇입니까?

df1 = subset(mtcars, select="gear") 

head(df1) 

        gear 
Mazda RX4   4 
Mazda RX4 Wag  4 
Datsun 710   4 
Hornet 4 Drive  3 
Hornet Sportabout 3 

번째 세트의 포맷이 같다 :

df2 = t(mtcars)[1:4,] 

head(df2) 

    Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout 
mpg   21   21  22.8   21.4    18.7  
cyl   6    6  4.0   6.0    8.0  
disp  160   160  108.0   258.0    360.0 
hp   110   110  93.0   110.0    175.0 

df1의 열 이름의 열 이름들이다 df2.

나는 gear에있는 df1에있는 동일한 자동차를 모두 타고 싶습니다. 그런 다음 차량에 대해서만 mpgdisp의 평균을 계산 한 다음, 평균에서 높음을 기준으로 그룹을 정렬합니다. (gear 3와 자동차 gear 4와 것보다 mpgdisp의 높은 평균이 있기 때문에)이 경우

는, 예상되는 결과는 다음과 같습니다
 Hornet 4 Drive Hornet Sportabout Mazda RX4 Mazda RX4 Wag Datsun 710 
mpg    21.4    18.7   21   21  22.8  
cyl    6.0    8.0   6    6  4.0     
disp   258.0   360.0   160   160  108.0 
hp    110.0   175.0   110   110  93.0 

내가이 당신에게 분명하다 바랍니다. 그룹 df1의 그룹 ( gear)을 df2에 적용하고 그룹의 평균을 기준으로 df2을 주문하는 방법을 모르겠습니다. 감사!

+0

- 원하지 않는 당신의 출력은'gear = 3','gear = 4' ... 등의 컬럼을 갖습니다. 왜냐하면 각'gear'를 그룹으로 취급하기를 원합니까? –

+0

원본'df2 '에는'gear'가 없습니다. 나는 당신이 무엇을 의미 하는지를 안다.'df1'의 데이터에 기초하여'df2'에'gear '라는 새로운 행을 추가하고 그들을 그룹으로 분류하는 것이 좋을까요? – kin182

+0

나는 완전히 이해하지 못하지만'reshape2 :: melt (df2)'와 같은 것을 사용하여 df1과 비슷한 형식으로 만들 것을 제안한다. 'dplyr :: bind_rows' (또는'rbind')를 사용하여 하나의 큰 데이터 프레임으로 만듭니다. 이제'dplyr :: group_by'와'summarize'를 사용할 수 있습니다. 'reshape2 : dcast'가 필요합니다. – epi99

답변

1

먼저 df2을 다시 옮기고 df1row.names으로 병합합니다.

tdf2 <- t(df2) 
dfmerge <- merge(df1, tdf2, by = "row.names") 

이어서 평균 + DISP 최고 평균에서 최저까지 내림차순 차 배치에도 gear별로 그룹화하고, 계산 dplyr를 사용한다.

m.mpg.disp <- dfmerge %>% group_by(gear) %>% 
       mutate(mean.mpg.disp = mean(mpg + disp)) %>% 
       arrange(desc(mean.mpg.disp)) 

마지막으로 데이터를 다시 변환하기 위해서. 당신은, 당신은 변수 이름으로 finaldf의 첫 번째 행을 사용하고 gearmean.mpg.disp (평균 + DISP의 합계의 평균)에 해당하는 행을 삭제할 수 있기

finaldf <- as.data.frame(t(m.mpg.disp)) 

정확히 데이터 프레임을 얻으려면.

names(finaldf) <- as.matrix(finaldf[1, ]) 
finaldf <- finaldf[-c(1,2,7), ] 
finaldf[] <- lapply(finaldf, function(x) type.convert(as.character(x))) 
finaldf 

마지막 단계 나는 here

에서 결과 (단지 처음 세 개의 열 표시)을 빌려 : 나는 당신의 예상 출력에 의해 혼란 스러워요

 AMC Javelin Cadillac Fleetwood Camaro Z28 
mpg   15.2    10.4  13.3 
cyl   8.0    8.0  8.0 
disp  304.0    472.0  350.0 
hp   150.0    205.0  245.0 
+0

와우, 잘 작동합니다. 감사! – kin182