Как мы можем использовать каждое значение «текущей строки» в качестве аргумента условия в выражении агрегации - PullRequest
0 голосов
/ 31 марта 2020

Я хочу создать соответствующее значение (в новом последнем столбце) путем агрегирования моей таблицы по условиям сумм, которые некоторые из соответствующих значений строки используются при этих условиях и вычислениях:

Пример:

My problem described in this picture:

Сумма всех «вторых», если «первое» равно текущему первому значению (A), а «второе» равно текущему второму значению (5)

В Excel, мы обращаемся к текущей строке, используя ее адрес легко и расширяя формулу путем перетаскивания. В PoweBI / DAX мы используем функцию EARLIER для ссылки на текущее значение строки. Я не знаю, что мне делать в R.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Вычисление сумм групп по обеим переменным: Первая и Вторая.

df$C <- with(df, ave(Second, First, Second, FUN = sum))
df

#   First Second  C
# 1     A      5 10
# 2     A     10 10
# 3     B      5 10
# 4     B     10 20
# 5     B     10 20
# 6     B      5 10
# 7     A      5 10

dplyr форма

library(dplyr)

df %>%
  group_by(First, Second) %>%
  mutate(C = sum(Second))

Или

df %>%
  group_by(First, Second) %>%
  add_tally(Second, name = "C")

Данные

df <- data.frame(First = c("A", "A", "B", "B", "B", "B", "A"),
                 Second = c(5, 10, 5, 10, 10, 5, 5))

Редактировать (Дополнительный вопрос из комментария)

Сумма всех секунд, если «Первый» равен текущему первому значению, а «Второй» БОЛЬШЕ текущего значения второго:

library(dplyr)
library(purrr)

df %>%
  group_by(First) %>%
  mutate(D = map_dbl(Second, ~ sum(Second[Second > .])))

#   First Second     D
#   <fct>  <dbl> <dbl>
# 1 A          5    10
# 2 A         10     0
# 3 B          5    20
# 4 B         10     0
# 5 B         10     0
# 6 B          5    20
# 7 A          5    10
0 голосов
/ 31 марта 2020

dplyr решение:

Вы описали базовую сумму всех секунд значений для каждой уникальной пары первых и вторых, Следовательно, мы можем просто сгруппировать их и вычислить итоги внутри каждой группы:

# required library
library(dplyr)

df %>%
# grouping unique pairs of values of 'First' and 'Second'
  group_by(First, Second) %>%
# computing sum of 'Second' within created groups
  mutate(C = sum(Second))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...