在组类别末尾的新列中添加具有组总和的行

时间:2018-12-06 15:04:41

标签: r

从昨天开始我一直在搜索这些信息,但是到目前为止,我找不到解决我问题的好方法。

我有以下dataframe

CODE    CONCEPT   P. NR.    NAME    DEPTO.  PRICE
 1       Lunch     11       John    SALES   160
 1       Lunch     11       John    SALES   120
 1       Lunch     11       John    SALES   10
 1       Lunch     13       Frank    IT     200
 2      Internet   13       Frank    IT     120

,我想添加一个列,其中包含按组分组的行总和,例如concept: Lunch的{​​{1}},code: 1的总数,以便获得这样的输出:

name

到目前为止,我尝试过:

CODE    CONCEPT   P. NR.    NAME    DEPTO.   PRICE  TOTAL
 1       Lunch     11       John    SALES     160   NA
 1       Lunch     11       John    SALES     120   NA
 1       Lunch     11       John    SALES     10    290
 1       Lunch     13       Frank    IT       200   200
 2      Internet   13       Frank    IT       120   120

但是,这样只能检索aggregate(PRICE~NAME+CODE, data = df, FUN = sum) 中的total

concepts

而不是包含我想要的其余数据的表。 我还尝试使用NAME CODE TOTAL John 1 290 Frank 1 200 Frank 2 120 添加额外的列,但是以某种方式无法将NA粘贴到特定的行位置。

有什么建议吗?我希望可以在total中做些事情。 谢谢!

2 个答案:

答案 0 :(得分:4)

在基数R中,您可以使用ave添加新列。仅当组的sum是组中的最后一行时,我们才会插入。

df$TOTAL <- with(df, ave(PRICE, CODE, CONCEPT, PNR, NAME, FUN = function(x) 
                ifelse(seq_along(x) == length(x), sum(x), NA)))

df
#  CODE  CONCEPT PNR  NAME DEPTO. PRICE TOTAL
#1    1    Lunch  11  John  SALES   160    NA
#2    1    Lunch  11  John  SALES   120    NA
#3    1    Lunch  11  John  SALES    10   290
#4    1    Lunch  13 Frank     IT   200   200
#5    2 Internet  13 Frank     IT   120   120

使用dplyr

的相似逻辑
library(dplyr)
df %>%
   group_by(CODE, CONCEPT, PNR, NAME) %>%
   mutate(TOTAL = ifelse(row_number() == n(), sum(PRICE) ,NA))

答案 1 :(得分:0)

对于基本R选项,您可以尝试合并原始数据框并进行汇总:

df2 <- aggregate(PRICE~NAME+CODE, data = df, FUN = sum)
out <- merge(df[ , !(names(df) %in% c("PRICE"))], df2, by=c("NAME", "CODE"))
out[with(out, order(CODE, NAME)), ]

   NAME CODE  CONCEPT PNR  DEPT PRICE
1 Frank    1    Lunch  13    IT   200
3  John    1    Lunch  11 SALES   290
4  John    1    Lunch  11 SALES   290
5  John    1    Lunch  11 SALES   290
2 Frank    2 Internet  13    IT   120