2012-08-16 49 views
2

我想使用plyr,但在使用多個變量時遇到困難。 這裏是一個例子。在plyr中使用多個變量

df <- read.table(header=TRUE, text=" 
    Firm Foreign SME Turnover 
A1  N Y  200 
A2  N N  1000 
A3  Y Y  100 
A1  N N  500 
A2  Y Y  200 
A3  Y Y  1000 
A1  Y N  200 
A2  N N  1000 
A2  N Y  100 
A2  N Y  200 ") 

我想創建一個表,它總結了兩個變量的營業額。 基本上將下述代碼

t1 <- ddply(df, c('Firm', 'Foreign'), summarise, 
     BudgetForeign = sum(Turnover, na.rm = TRUE)) 

t2 <- ddply(df, c('Firm', 'SME'), summarise, 
     BudgetSME = sum(Turnover, na.rm = TRUE)) 

與結果如下

res <- read.table(header=TRUE, text=" 
Firm   A1 A2 A3 
BudgetForeign 200 200 1100 
BudgetSME  200 500 1100") 
res 

我怎樣才能做到這一點而不做多的操作和子集,之後結合?

在此先感謝。

回答

6

我認爲你只想要外國或中小企業的價值是'Y' ......如果是這樣的話。我會使用reshape2包中的meltdcast而不是plyr

df.m <- melt(df, id.var=c('Firm', 'Turnover')) 

dcast(df.m[df.m$value=='Y',], variable ~ Firm, value.var='Turnover', fun.aggregate=sum) 

    variable A1 A2 A3 
1 Foreign 200 200 1100 
2  SME 200 500 1100 

如果你想看到YN之間的差異也可以在dcast將它們添加到配方:

> dcast(df.m, variable + value ~ Firm, value.var='Turnover', fun.aggregate=sum) 
    variable value A1 A2 A3 
1 Foreign  N 700 2300 0 
2 Foreign  Y 200 200 1100 
3  SME  N 700 2000 0 
4  SME  Y 200 500 1100 
> 
+0

感謝賈斯汀。至少我知道從哪裏開始。我有一個問題,但。它將如何工作我希望Foreign和SME的不同值分別爲「Y」和「N」。 – user1043144 2012-08-16 16:42:52

+0

@ user1043144不知道我明白。您可以將它添加到'dcast'中的公式中,並將其從'df.m []'中移除。看我的編輯。 – Justin 2012-08-16 16:57:13

+0

感謝賈斯汀。庫(reshape2) df.m < - 融化(DF,id.var = C( '事務所', '週轉')) X < - dcast(df.m,可變+值〜事務所value.var = 'Turnover',fun.aggregate = sum) res < - rbind( BudgetForeign = subset(x,variable =='Foreign'&value =='Y'), BudgetSME = subset(x,variable == 「中小企業」和值==「Y」) ) – user1043144 2012-08-16 18:42:59

0

感謝賈斯汀。 從你的答案,下面的代碼應該可以解決我的問題。

library(reshape2) 
df.m <- melt(df, id.var=c('Firm', 'Turnover')) 

x <- dcast(df.m, variable + value ~ Firm, value.var='Turnover', fun.aggregate=sum) 


res <- rbind(
     BudgetForeign = subset(x, variable == 'Foreign' & value == 'Y'), 
     BudgetSME = subset(x, variable == 'SME' & value == 'Y') 
     ) 
res 
+0

你可以做,如果沒有'rbind'一步...子集就像我在我的第一個例子,用我在第二個例子中使用的公式。 'RES < - dcast(df.m [df.m $值== 'Y',],變量+值〜事務所value.var = '營業額',fun.aggregate =總和)'。然後,如果您想要命名行,請繼續。 'row.names(RES)< - C( 'BudgetForeign', 'BudgetSME')' – Justin 2012-08-16 18:49:04