我正在尝试使用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
如何在不进行多项操作和子集的情况下实现此目的并在之后进行组合?
提前致谢。
答案 0 :(得分:6)
我认为你只想要外国或中小企业'Y'
的价值......如果是这样的话。我会使用melt
包中的dcast
和reshape2
而不是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
如果您想查看Y
和N
之间的差异,也可以将它们添加到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
>
答案 1 :(得分: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