我一直从头开始教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抛出一条警告信息说> =对因素没用? 如果有任何一个人理解这个错综复杂的信息,我将非常感谢你的帮助。
答案 0 :(得分:0)
使用这些阈值:对于每个ID,对于每个月,每个月 - 我需要计算值> = ID为第99百分位数的次数(每年每月)
这是否意味着你想要
(注意:你的示例代码按照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')
。summarize
或mutate
或transform
之类的内容,您可以轻松地执行此操作而无需执行前面的所有Total$
列名称。