3

販売データの単純なテーブルがあるとします

> df<-data.frame(country=c("A", "A", "B", "B"), outlet=c(1,2,1,2), sales=c(300, 900,10,40))
> df
  country outlet sales
1       A      1   300
2       A      2   900
3       B      1    10
4       B      2    40

そして、その国の全売上のうち、各販売店が貢献した割合を示す列を追加したいと考えています。splitを使用して反復してから再結合することでこれを行うことができますがrbind、これは私にはかなり醜く見えます

> do.call("rbind",lapply(split(df, df$country), function(x) { x$frac <- NA; tot<-sum(x$sales); for (o in x$outlet) {s<-x[x$outlet== o,]$sales; x[x$outlet == o,]$frac <- s/tot}; return(x)}))
    country outlet sales frac
A.1       A      1   300 0.25
A.2       A      2   900 0.75
B.3       B      1    10 0.20
B.4       B      2    40 0.80

この単純なタスクを実行するためのよりクリーンな方法はありますか (単に醜さをスクリプトに一掃する関数を記述する以外に)?

(そしてボーナスポイントとして、結果のrbindような行名を追加するのを防ぐ方法はありますか?)A.1data.frame

4

3 に答える 3

2

別の方法:

df$frac <- df$sales / ave(df$sale, df$country, FUN = sum)
df
#  country outlet sales frac
#1       A      1   300 0.25
#2       A      2   900 0.75
#3       B      1    10 0.20
#4       B      2    40 0.80
于 2013-11-04T21:46:49.813 に答える
1

ここにもっと簡単な方法があります

x <- tapply(df$sales, df$country, sum) #total sales by country
df$frac <- df$sales/x[match(df$country, names(x), nomatch=-1)] 
df
于 2013-11-04T21:30:05.213 に答える
0

次のように、新しい列をデータ フレームに直接追加するだけです。

value <- # The code to calculate frac
df$frac <- value

読みやすいように2行に分けました。

deparse.level = 0呼び出しでrbind、関数がラベルを作成しないように設定できます。

于 2013-11-04T21:15:13.530 に答える