我一直在从头开始自学R,所以请容忍我。我已经找到了多种方法来计算观测值,然而,我正在试图弄清楚如何使用(logical?)表达式。我有一组大约一百万个观察值的海量数据。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年month=1的CPUELE25399,第99个百分位值是3 (3是前1%的下限)
使用这些阈值:对于每个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抛出一条警告消息,说明>=对因子没有用处?如果有任何人理解这个令人费解的信息,我将非常感谢您的帮助。
发布于 2015-07-17 08:35:57
使用以下阈值:对于每个ID、每年、每个月-我需要计算值>=达到第99个百分比的次数(每月、每年)
这是不是意味着你想
(注意:您的示例代码按经度/经度分组,但您的问题中没有提到这一点,所以我忽略它。如果您希望将其添加到中,只需将其作为分组变量添加到适当的位置即可。
在这种情况下,您可以先使用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)组合,将对所有不同的(经度,经度)重复Freq。
ddply上的注释:
.(ID, Month, Year)而不是c('ID', 'Month', 'Year')如果您只想添加额外的列,使用summarize或mutate或transform之类的命令可以让您灵活地执行此操作,而无需在列名前面执行所有Total$。https://stackoverflow.com/questions/31466419
复制相似问题