【问题标题】:Using FOR loop for finding out the sum of variables?使用 FOR 循环找出变量的总和?
【发布时间】:2015-12-22 13:08:40
【问题描述】:

我有一个数据框,其中包含我从国家排放清单网站获得的 6 个变量的 6,497,651 个观察值,它具有以下变量:

fips    SCC       Pollutant     Emissions    type    year
09001   10100401  PM25          15.14        POINT   1999
09001   10100402  PM25          234.75       POINT   1999

其中fips是县代码,SCC是源字符串名称,Pollutant是污染物类型(本例中为PM2.5排放),Emissions表示污染物排放量以吨为单位,type 是排放污染物的来源类型(道路、非道路、点等),year 记录了从 1999 年到 2008 年的年份。

基本上,我必须绘制一个简单的线图来展示每年排放水平的变化。现在,仅 1999 年就有上千个观测值;直到 2008 年的其他年份也是如此。这个问题一点也不难,因为我可以很容易地为每一年形成一个新的数据框,其中记录了所有排放量的总和,然后行绑定所有这些子集数据框。但是实现这一点的更有效和更整洁的方法可能是使用 FOR 循环,我可以根据每年计算“排放”下所有值的总和,并将所有这些信息存储到一个新的数据框中,但我被卡住了从哪里开始。如何输入将根据每年计算值总和的确切语法?我应该有一个看起来像这样的数据框:

Year    Emissions

Emissions 记录了该特定年份所有排放值的总和。

【问题讨论】:

  • 不要循环,ddply。见ddply。例如:ddply(data, .(Year), function(x){em_sum <- sum(x$Emissions) data.frame(Emissions = em_sum)}) 类似的东西。如果您必须循环,需要注意的是,超过 1000 次迭代(可以说更少)通常有更有效的方法来获得所需的结果。
  • 也许是with(mydata, tapply(Emissions, year, sum))。最好添加一些带有您预期结果的实际样本数据。
  • 根据@Pierre 的要求添加了详细信息

标签: r loops dataframe


【解决方案1】:

data.table 包可能是处理此类事情的最有效的包。计算每年排放总量的语法是这样的(假设您的数据存储在dt):

library(data.table)
dt=data.table(dt)
dt[,.(Emissions=sum(Emissions)),by=year]

【讨论】:

  • 我建议使用setDT() 而不是data.table(),它会从 data.frame 返回一个 data.table 而无需深度复制。它已经存在了很长时间。
【解决方案2】:

dplyr/ggplot 选项。我们按“年份”分组,使用summarise 获取“排放”的sum,并使用ggplot 进行绘图。

library(dplyr)
library(ggplot2) 
df1 %>%
   group_by(year) %>% 
   summarise(Emissions=sum(Emissions)) %>%
   ggplot(., aes(x=year, y=Emissions))+
   geom_line()

或者这可以直接在ggplot内完成

ggplot(df1, aes(x=year, y=Emissions)) + 
                stat_summary(fun.y='sum', geom='line')

【讨论】:

    猜你喜欢
    • 2013-06-12
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2020-04-05
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多