【问题标题】:Compute data on one column based on aggregate results from another column根据另一列的聚合结果计算一列上的数据
【发布时间】:2012-09-07 00:41:11
【问题描述】:

我想使用 data.table 计算汇总统计,然后根据该结果计算第二列的统计。

这是一个使用空气质量数据的示例。

设置数据

(假装它是这样来的)

library(data.table)
dt = as.data.table(airquality)
dt[ , Season:=ifelse(Month>7, 'Fall', 'Summer')]

有些月份风很大

## The range of monthly Wind values
dt[ , list(MinWind=min(Wind), MaxWind=max(Wind)), 
        by=c('Season', 'Month')]

---- R OUTPUT:
   Season Month MinWind MaxWind
1: Summer     5     5.7    20.1
2: Summer     6     1.7    20.7
3: Summer     7     4.1    14.9
4:   Fall     8     2.3    15.5
5:   Fall     9     2.8    16.6
>

目标:计算平均季节性太阳辐射,按风速大于或小于 20 的月份分组。

我可以一步完成吗?

## Add a column to indicate if it was a high wind month
dt[, HighWind:=any(Wind>20), by=Month]
## Aggregate based on both HighWind and Season
dt[, list(AveSolarR=mean(Solar.R, na.rm=TRUE)), by=c("HighWind","Season")]

---- R OUTPUT:
   HighWind season AveSolarR
1:     TRUE Summer  185.9649
2:    FALSE Summer  216.4839
3:    FALSE   Fall  169.5690

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    为什么不将两者合并为一个list

    dt[,list(HighWind=any(Wind>20),AveSolarR=mean(Solar.R,na.rm=T)),by=Month]
       Month HighWind AveSolarR
    1:     5     TRUE  181.2963
    2:     6     TRUE  190.1667
    3:     7    FALSE  216.4839
    4:     8    FALSE  171.8571
    5:     9    FALSE  167.4333
    

    对于修改后的问题,需要在by语句中做HighWind的计算,但是我觉得这样比较复杂。

    dt[,list(AveSolarR=mean(Solar.R,na.rm=T)),
      by=list(HighWind=Month%in%Month[Wind>20],Season)]
       HighWind Season AveSolarR
    1:     TRUE Summer  185.9649
    2:    FALSE Summer  216.4839
    3:    FALSE   Fall  169.5690
    

    【讨论】:

    • 抱歉,我在制作示例时搞砸了这个问题。我稍后再试。 (我打算删除问题)
    • @geneorama 我现在已经解决了你修改后的问题
    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2019-12-18
    • 2017-08-20
    • 2021-04-12
    • 2022-07-01
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多