使用tidyverse函数有效地汇总和转换数据表

时间:2018-12-31 21:20:19

标签: r tidyverse purrr

我有一个相对较大的数据文件,看起来像(a),并且需要创建一个结构(b)。因此,我需要计算每个ID和每年的金额乘以系数之和。

enter image description here

我很快使用嵌套的for循环将某些东西一起砍掉了,但这当然效率很低:

short

我想知道如何使用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()或任何其他dydyverse函数有效地解决此问题。

预先感谢您的有用建议。

2 个答案:

答案 0 :(得分:1)

感谢您的提示,这实际上只是一行:

result  <- data %>% group_by(id, year) %>% summarise(S=sum(amount*coef)) %>% spread(year, S)

答案 1 :(得分:1)

这是一种可行的方法。我确定还有其他人。

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)