使用tidyverse函数高效地汇总和转换数据表
我有一个比较大的数据文件,看起来像(a),需要创建一个类似(b)的结构。因此,我需要计算每个ID和每年的金额乘以系数之和 我使用嵌套for循环快速地将一些东西拼凑在一起,但这当然是非常低效的:使用tidyverse函数高效地汇总和转换数据表,r,tidyverse,purrr,R,Tidyverse,Purrr,我有一个比较大的数据文件,看起来像(a),需要创建一个类似(b)的结构。因此,我需要计算每个ID和每年的金额乘以系数之和 我使用嵌套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,1
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)
库(tidyverse)
数据谢谢你的提示,这实际上只是一句话:
result <- data %>% group_by(id, year) %>% summarise(S=sum(amount*coef)) %>% spread(year, S)
result%group\u by(id,year)%%>%summary(S=sum(amount*coef))%%>%spread(year,S)
这里有一种似乎可行的方法。我肯定还有其他人
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)
库(tidyverse)
我查了一下“从长到宽的[r][[tidyverse]”?spread
会帮你找到的哈哈……哦。在我意识到你破解它之前,我发布了我的。很好的说明,你通常可以用不同的方式到达同一个地方。:-)谢谢,我对tidyverse还是新手,所以看到不同的方式很有帮助;-)