Как применить функцию к подмножеству data.table несколькими столбцами в R? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть таблица данных с подсчетами изменений для нескольких групп. Например:

input <- data.table(from = c("A", "A", "A", "B", "B", "B", "A", "A", "A", "B", "B", "B"),
                 to = c(letters[1:6], letters[1:6]),
                 from_N = c(100, 100, 100, 50, 50, 50, 60, 60 ,60, 80, 80, 80),
                 to_N = c(10, 20, 40, 5, 5, 15, 10, 5, 10, 20, 5, 10),
                 group = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2))

Как рассчитать сумму для каждого изменения в группах? Я могу сделать это, используя для l oop, например:

out <- list()
for (i in 1:length(unique(input$from))){ 
  sub <- input[from == unique(input$from)[i]] 
  out2 <- list()
  for (j in 1:length(unique(sub$to))){
    sub2 <- sub[to == unique(sub$to)[j]]
    out2[[j]] <- data.table(from = sub2$from[1],
                  to = sub2$to[1],
                  from_N = sum(sub2$from_N),
                  to_N = sum(sub2$to_N))
    print(unique(sub$to)[j])
  }
  out[[i]] <- do.call("rbind", out2)
  print(unique(input$from)[i])
}
output <- do.call("rbind", out)

Однако таблица данных, к которой мне нужно применить это, очень велика, и поэтому мне нужно максимизировать производительность. Есть ли метод data.table? Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Опция с dplyr

library(dplyr)
input %>%
 group_by(from, to) %>%
 summarise_at(vars(ends_with('_N')), sum)

Или в data.table

library(data.table)
setDT(input)[, lapply(.SD, sum),  by = .(from, to), .SDcols = patterns('_N$')]
0 голосов
/ 27 апреля 2020

Возможно, я что-то упустил, но, похоже, вы только что:

library(data.table)

setDT(input)[, .(from_N = sum(from_N), to_N = sum(to_N)), by = .(from, to)]

Вывод:

   from to from_N to_N
1:    A  a    160   20
2:    A  b    160   25
3:    A  c    160   50
4:    B  d    130   25
5:    B  e    130   10
6:    B  f    130   25
...