Добавить строку с суммой группы в новом столбце в конце категории группы - PullRequest
0 голосов
/ 06 декабря 2018

Я искал эту информацию со вчерашнего дня, но до сих пор не смог найти хорошее решение моей проблемы.

У меня есть следующее 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, 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 в определенную позицию строки.

Есть предложения?Я хотел бы иметь что-то, что я могу сделать в BaseR.Спасибо !!

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

В базе 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))
0 голосов
/ 06 декабря 2018

Для базовой опции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...