2016-10-10 7 views
0

分割をdata.frameに適用した後、一部の集計結果を別のdata.frameに組み立て直す際に問題があります。私は '非分割'機能を使用してみましたが、希望の結果を得るために適切に使用する方法を理解できません。一般的な「mtcars」データを説明しましょう。私の最終的な結果は、cyl(シリンダー)とmean_mpg(同じシリンダー数を共有するグループのmpgの平均)の2つの変数を持つデータフレームを取得することです。分割後のデータフレームの再アセンブリ

だから、最初の分割はこのように書きます:

spl <- split(mtcars, mtcars$cyl) 

このような何かに見え、その結果:

$`4` 
       mpg cyl disp hp drat wt qsec vs am gear carb 
Datsun 710  22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 
Merc 240D  24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 
... 

$`6` 
       mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4  21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 
... 

$`8` 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 
Duster 360   14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 
... 

今私はの線に沿って何かをしたい:

df <- as.data.frame(lapply(spl, function(x) mean(x$mpg)), col.names=c("cyl", "mean_mpg")) 

ただし、上記の結果は

  X4  X6 X8 
1 26.66364 19.74286 15.1 

私はこのようになりDFをしたいと思いながら:あなたが見て、スプリットを組み立て直すにのみ関心がある場合は、

cyl mean_mpg 
1 4 26.66364 
2 6 19.74286 
3 8 15.10000 

おかげJ.

+0

'集約(MPG〜CYL、mtcars、関数(X){平均値(X)})私が必要まさに' – alistaire

答えて

1

(2)、(4 )及び(4A)が、実際の根本的な疑問は基より集計を実行する方法については本当にあるならば、それらはすべてが対象となり得る:

1)集計通常1は、Alなどのaggregateを使用していますコメントに記載された準備。少しの@ alistaireのコードを簡素化:

aggregate(mpg ~ cyl, mtcars, mean) 

2)スプリット/ lapply/do.callまた@rawrは、我々はまた、わずかに簡素化することができ、コメント内のスプリット/ lapply/do.callソリューション与えている:

spl <- split(mtcars, mtcars$cyl) 
do.call("rbind", lapply(spl, with, data.frame(cyl = cyl[1], mpg = mean(mpg)))) 

3)は do.call/by最後のものは交互byの点で書き直すことができる:

do.call("rbind", by(mtcars, mtcars$cyl, with, data.frame(cyl = cyl[1], mpg = mean(mpg)))) 

4)スプリット/ lapply /分割されていない別の可能性は、splitunsplitが使用する

spl <- split(mtcars, mtcars$cyl) 
L <- lapply(spl, with, data.frame(cyl = cyl[1], mpg = mean(mpg), row.names = cyl[1])) 
unsplit(L, sapply(L, "[[", "cyl")) 

4A)または列名が十分である場合

spl <- split(mtcars, mtcars$cyl) 
L <- lapply(spl, with, data.frame(mpg = mean(mpg), row.names = cyl[1])) 
unsplit(L, sapply(L, rownames)) 

上記使用しません任意のパッケージがありますが、dplyr、data.table、sqldfなどの集約を実行できるパッケージも多数あります。

5)

library(dplyr) 
mtcars %>% 
     group_by(cyl) %>% 
     summarize(mpg = mean(mpg)) %>% 
     ungroup() 

6)データ dplyr。

library(sqldf) 
sqldf("select cyl, avg(mpg) mpg from mtcars group by cyl") 
+0

パーフェクト、sqldfテーブル

library(data.table) as.data.table(mtcars)[, list(mpg = mean(mpg)), by = "cyl"] 

7)。ありがとう! – Jaroslav

関連する問題