R:tapply(x,y,sum)返回NA而不是0

时间:2016-08-16 19:24:27

标签: r sum na tapply

我有一个数据集,其中包含多年,地区,季度和类型的事件。样品:

REGION Prov Year Quarter Type Hit Miss
xxx     yy  2008  4     Snow  1   0   
xxx     yy  2009  2     Rain  0   1

我定义了变量以检查感兴趣的列:

syno.h <- data$Type
quarter.number<-data$Quarter
syno.wrng<- data$Type

我想获得每种类型的点击量,以及所有数据的季度。鉴于Hits是0或1,那么使用tapply的简单sum()函数是我的第一次尝试。

tapply(syno.h, list(syno.wrng, quarter.number), sum)

这回复了:

              1   2   3   4
ARCO         NA  NA  NA   0
BLSN          0  NA  15  74
BLZD          4  NA  17  54
FZDZ         NA  NA   0   1
FZRA         26   0 143 194
RAIN        106 126 137 124
SNOW         43   2 215 381
SNSQ          0  NA  18  53
WATCHSNSQ    NA  NA  NA   0
WATCHWSTM     0  NA  NA  NA
WCHL         NA  NA  NA   1
WIND         47  38 155 167
WIND-SUETES  27   6  37  56
WIND-WRECK   34  14  44  58
WTSM          0   1   7  18

对于某些在给定四分之一中没有出现的类型,tapply有时会返回NA而不是零。我已多次检查数据,我确信它很干净。不是NA的值也是正确的。

如果我使用sum()检查使用tapply返回NA的类型/四分之一组合,我会得到我期望的值:

sum(syno.h[quarter.number==3&syno.wrng=="BLSN"])
[1] 15
>  sum(syno.h[quarter.number==1&syno.wrng=="BLSN"])
[1] 0
>  sum(syno.h[quarter.number==2&syno.wrng=="BLSN"])
[1] 0
>  sum(syno.h[quarter.number==2&syno.wrng=="ARCO"])
[1] 0

似乎我的问题在于如何使用tapply和sum,而不是数据本身。

有没有人对这个问题有什么建议?

提前致谢

1 个答案:

答案 0 :(得分:0)

根据您正在寻找的内容,我有两种可能的解决方案。如果您只对每HitType的{​​{1}}个积极感兴趣,并且不需要记录何时不存在Quarter,那么您可以得到一个答案

Hit

如果记录那些没有命中的记录很重要,你可以使用

aggregate(data[["Hit"]], by =  data[c("Type","Quarter")], FUN = sum)