2013-11-04 40 views
2

假設我有銷售數據導出數據的列添加到data.frame

> 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.1所得到的data.frame的方法嗎?)

回答

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 
0

您只需直接添加新列到數據幀像這樣:

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

我把它分成兩行,使它更具可讀性。

您可以在rbind調用中設置deparse.level = 0使函數構造無標籤。

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