Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用tidyverse函数高效地汇总和转换数据表_R_Tidyverse_Purrr - Fatal编程技术网

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

使用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

我有一个比较大的数据文件,看起来像(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,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还是新手,所以看到不同的方式很有帮助;-)