Суммируйте данные в базе R - PullRequest
0 голосов
/ 05 марта 2019

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

library(dplyr)
set.seed(1)
dat <- data.frame(x = rep(1:3, each = 5), a = runif(15, 0, 1), b = runif(15, 0, 2))

oper_fn <- function(df, oper){
  oper <- enquo(oper)
  df %>%
     group_by(x) %>%
     summarize(output = !! oper) %>%
     ungroup()
}

oper_fn(dat, sum(a) / sum(b))

Следующее также должно работать:

oper_fn(dat, sum(a))

Как это сделать в базе R?

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Вы можете просто разделить на x и использовать sapply, чтобы перебрать группы и применить свою функцию, например,

sapply(split(dat, dat$x), function(i) sum(i$a) / sum(i$b))
#        1         2         3 
#0.3448112 0.7289661 0.5581262
1 голос
/ 05 марта 2019

Другой вариант с использованием aggregate

tmp <- aggregate(.~x, dat, sum)
cbind(tmp[1], tmp['a']/tmp['b'])

#  x         a
#1 1 0.3448112
#2 2 0.7289661
#3 3 0.5581262

Или один вкладыш с использованием transform с aggregate

transform(aggregate(.~x, dat, sum), output = a/b)

#  x        a        b    output
#1 1 2.320376 6.729408 0.3448112
#2 2 3.194763 4.382595 0.7289661
#3 3 2.223499 3.983864 0.5581262
...