2017-04-23 35 views
2

聚集的我有一个数据帧,看起来像这样:不同类型中的R

sub = c("X001","X001", "X001","X002","X002","X001","X002","X001","X002","X002","X002","X002") 
revenue = c(20, 15, -10,-25,20,-20, 17,9,14,12, -9, 11) 

df = data.frame(sub, revenue) 

我想要聚合它以这样一种方式,第二栏应该显示所有收入的总和为子,第三列应显示绝对值的总和,第四列应显示所有正值的总和,第五列应显示所有负值的总和。

结果应该是这样的:

Sub  All Sum  Absolute Sum  Positive Sum  Negative Sum 

X001  14   74     44     -30 
X002  40   108    74     -34 

我已经写了计算所有总和代码:

y<-aggregate(df$revenue, by=list(Feature=x$Sub), FUN=sum) 

我真的很感激,如果有人中的R更见地会帮我在计算其他三列。

回答

3

以下是如何与dplyr做:

library(dplyr) 
df%>% 
group_by(sub)%>% 
summarise(All_Sum=sum(revenue),Absolute_Sum=sum(abs(revenue)), 
      Positive_Sum=(sum(revenue[revenue>0])),Negative_Sum=(sum(revenue[revenue<0]))) 

    sub All_Sum Absolute_Sum Positive_Sum Negative_Sum 
    <fctr> <dbl>  <dbl>  <dbl>  <dbl> 
1 X001  14   74   44   -30 
2 X002  40   108   74   -34 
+0

三江源,它的伟大工程:) –

1

在基础R使用aggregate

aggregate(.~sub, df, function(a) c(sum(a), sum(abs(a)), sum(a[a>0]), sum(a[a<0]))) 

# sub revenue.1 revenue.2 revenue.3 revenue.4 
#1 X001  14  74  44  -30 
#2 X002  40  108  74  -34 
+1

这真的很酷,我不知道聚合函数可以像这样扩展。谢谢 –

0

我们也可以使用data.table

library(data.table) 
setDT(df)[, .(All_Sum = sum(revenue), Absolute_Sum = sum(abs(revenue)), 
    Positive_Sum = sum(revenue[revenue>0]), Negative_Sum = sum(revenue[revenue<0])), by = sub] 
# sub All_Sum Absolute_Sum Positive_Sum Negative_Sum 
#1: X001  14   74   44   -30 
#2: X002  40   108   74   -34