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

R: tapply(x,y,sum) returns NA instead of 0

我有一个数据集,其中包含多个年份、地区、季度和类型的事件发生情况。示例:

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)

这个return编辑:

              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

对于在给定季度中没有出现的某些类型,有时应用 returns NA 而不是零。我检查了很多次数据,我确信它是干净的。不是 NA 的值也是正确的。

如果我只使用 sum() 检查 type/quarter NA 与 tapply 的 type/quarter 组合,我得到我期望的值:

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 一起使用,而不是数据本身。

有人对问题可能有什么建议吗?

提前致谢

根据您的具体需求,我为您提供了两种可能的解决方案。如果您只对每个 TypeQuarter 的正 Hit 数量感兴趣并且不需要记录什么时候不存在 Hit,您可以得到一个回答为

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

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

dataHit <- data[data[["Hit"]] == 1, ]
dataHit[["Type"]] <- factor(data[["Type"]])
dataHit[["Quarter"]] <- factor(data[["Quarter"]])
table(dataHit[["Type"]], dataHit[["Quarter"]])