从昨天开始我一直在搜索这些信息,但是到目前为止,我找不到解决我问题的好方法。
我有以下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
中做些事情。
谢谢!
答案 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