我有一个看起来像这样的数据框:
Year Iteration Production Technology
2015 1 200 Gas
2015 1 305 Gas
2016 1 150 Gas
2016 1 200 Gas
2015 2 200 Gas
“技术”列说明发电厂的类型。因此,对于“每年”和“每次迭代”,“技术”列中都会有多个工厂。
我想对数据进行汇总,以使该年份具有一个值,所有迭代的平均值以及该特定技术的所有发电厂的总和。
在此示例中为:
Year Iteration Production Technology
2015 1.5 705 Gas
2016 1.5 350 Gas
我尝试了各种使用汇总功能的方法,但是由于它也会汇总“技术”列(将总产量除以电厂数量)而失败。
答案 0 :(得分:3)
一个选项是tidyverse
可以按“年份”,“技术”分组,获得“ {迭代”的mean
和“生产”的sum
library(tidyverse)
df1 %>%
group_by(Year, Technology) %>%
summarise(Iteration = mean(Iteration),
Production = sum(Production))
# A tibble: 2 x 4
# Groups: Year [2]
# Year Technology Iteration Production
# <int> <chr> <dbl> <int>
#1 2015 Gas 1.33 705
#2 2016 Gas 1 350
df1 <- structure(list(Year = c(2015L, 2015L, 2016L, 2016L, 2015L), Iteration = c(1L,
1L, 1L, 1L, 2L), Production = c(200L, 305L, 150L, 200L, 200L),
Technology = c("Gas", "Gas", "Gas", "Gas", "Gas")),
class = "data.frame", row.names = c(NA,
-5L))
答案 1 :(得分:3)
library(data.table)
dt1[ , list(Iteration=mean(Iteration),
Production=sum(Production)),
by=list(Year,Technology)]
#> Year Technology Iteration Production
#> 1: 2015 Gas 1.333333 705
#> 2: 2016 Gas 1.000000 350
中的另一种方法:
sqldf
作为我最近对sql的痴迷,这是使用library(sqldf)
sqldf("select Year, Technology,
avg(Iteration) as AVG_Iteration, sum(Production) as TOT_Production
from dt1
group by Year, Technology", drv="SQLite")
#> Year Technology AVG_Iteration TOT_Production
#> 1 2015 Gas 1.333333 705
#> 2 2016 Gas 1.000000 350
软件包的解决方案:
dt1 <- fread(input = " Year Iteration Production Technology
2015 1 200 Gas
2015 1 305 Gas
2016 1 150 Gas
2016 1 200 Gas
2015 2 200 Gas ")
由reprex package(v0.3.0)于2019-06-19创建
数据:
{{1}}