使用(逻辑?)表达式计算频率

时间:2015-07-16 23:53:34

标签: r frequency

我一直从头开始教R,所以请耐心等待。我已经找到了多种计算观测值的方法,但是,我试图弄清楚如何使用(逻辑?)表达式计算频率。我有大量数据,大约有100万个观测值。 df设置如下:

    Latitude    Longitude   ID  Year    Month   Day Value
66.16667    -10.16667   CPUELE25399 1979    1   7   0
66.16667    -10.16667   CPUELE25399 1979    1   8   0
66.16667    -10.16667   CPUELE25399 1979    1   9   0

共有154个唯一ID,同样154个唯一纬度/长度。我专注于每个唯一ID的所有值的前1%。对于每个唯一ID,我使用其相关值计算了第99个百分位数。我进一步计算每个ID的个人年份和月份的第99百分位数,例如,对于1979年的CPUELE25399,月份= 1,第99百分位值为3(3为最高1%的最低值)

使用这些阈值:对于每个ID,对于每个月,每个月 - 我需要计算值> = ID为第99百分位数的次数(每年每月)

我已尝试过至少100种不同的方法,但我认为我从根本上误解了语法中的某些内容?这是让我获得最远的代码片段:

ddply(Total,
      c('Latitude','Longitude','ID','Year','Month'),
        function(x) c(Threshold=quantile(x$Value,probs=.99,na.rm=TRUE),
                      Frequency=nrow(x$Value>=quantile(x$Value,probs=.99,na.rm=TRUE))))

R抛出一条警告信息说> =对因素没用? 如果有任何一个人理解这个错综复杂的信息,我将非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

  

使用这些阈值:对于每个ID,对于每个月,每个月 - 我需要计算值> = ID为第99百分位数的次数(每年每月)

这是否意味着你想要

  1. 计算每个ID的第99个百分位数(即忽略月份等),然后那么
  2. 算出你超过这个值的次数,但现在按月和年分以及ID分开?
  3. (注意:你的示例代码按照lat / lon分组,但在你的问题中没有提到,所以我忽略了它。如果你想加入它,只需将它作为分组变量添加到适当的位置)。

    在这种情况下,您可以先使用ddply计算每ID百分位数:

    # calculate percentile for each ID
    Total <- ddply(Total, .(ID), transform, Threshold=quantile(Value, probs=.99, na.rm=T))
    

    现在你可以分组(ID,月份和年份)来查看你超过的次数:

    Total <- ddply(Total, .(ID, Month, Year), summarize, Freq=sum(Value >= Threshold))
    

    请注意,summarize将返回一个数据帧,其行数仅为.(ID, Month, Year)列,即将删除所有纬度/经度列。如果您想使用transform代替summarize,则会为每个(ID,Mon,Year)组合的所有不同(Lat,Lon)重复Freq

    关于ddply的说明:

    • 可以执行.(ID, Month, Year)而不是c('ID', 'Month', 'Year')
    • 如果您只想添加额外的列,使用summarizemutatetransform之类的内容,您可以轻松地执行此操作而无需执行前面的所有Total$列名称。