Эффективное суммирование и преобразование таблицы данных с использованием функций Tidyverse - PullRequest
0 голосов
/ 01 января 2019

У меня есть относительно большой файл данных, который выглядит как (а), и мне нужно создать структуру вроде (б).Таким образом, мне нужно вычислить сумму значений Amount times Coeficient для каждого идентификатора и каждого года.

enter image description here

Я быстро что-то взломал, используя вложенные циклы for, ноэто, конечно, ужасно неэффективно:

library(tidyverse)

data  <- tibble(
    id=c("A", "B", "C", "A", "A", "B", "C"),
    year=c(2002,2002,2004,2002,2003,2003,2005),
    amount=c(1000,1500,1000,500,1000,1000,500),
    coef=rep(0.5,7)
)

years  <- sort(unique(data$year))
ids  <- unique(data$id)

result  <- matrix(0,length(ids),length(years)) %>%
    as.tibble() %>% setNames(., years)

for (i in seq_along(ids)){
    for (j in seq_along(years)){
        d  <- filter(data, id==ids[i] & year== years[j])
        if (nrow(d)!=0){
            result[i,j]  <- sum(d$amount*d$coef)
        }
    }
}
result  <- add_column(result, ID=ids, .before = 1)

Мне было интересно, как можно решить эту проблему эффективно, используя map(), group_by() или любые другие функции обратного хода.

Заранее благодарим за полезные советы.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Вот один способ, который, кажется, работает.Я уверен, что есть другие.

library(tidyverse)

id <- c("A", "B", "C", "A", "A", "B", "C")
year <- c(2002,2002,2004,2002,2003,2003,2005)
amount <- c(1000,1500,1000,500,1000,1000,500)
coef <- rep(0.5,7)

data <- tibble(id, year, amount, coef)

table <- data %>% 
  group_by(., id, year)  %>%  
  mutate(prod = amount*coef)%>%
  summarize(., sumprod = sum(prod)) %>%
  spread(., year, sumprod) %>% 
  replace(is.na(.), 0)
0 голосов
/ 01 января 2019

Спасибо за подсказку, это действительно одна строка:

result  <- data %>% group_by(id, year) %>% summarise(S=sum(amount*coef)) %>% spread(year, S)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...