【问题标题】:R: tapply(x,y,sum) returns NA instead of 0R:tapply(x,y,sum) 返回 NA 而不是 0
【发布时间】:2016-08-16 19:24:27
【问题描述】:

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

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() 检查返回 NA 和 tapply 的类型/季度组合,我会得到我期望的值:

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

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

提前致谢

【问题讨论】:

  • syno.wrngNULL 因为你定义它时的拼写错误。而且,sum 对因子没有意义。一个可重现的例子会很棒。
  • 这只是我的代码示例,在实际代码中 syno.wrng 很好。我检查了所有输入,它们都有预期值。我很难举出一个可重复的例子,因为我无法分享我正在使用的数据。

标签: r sum na tapply


【解决方案1】:

根据您正在寻找的具体内容,我为您提供了两种可能的解决方案。如果您只对TypeQuarter 的正面Hits 数量感兴趣,并且不需要记录不存在Hits 的时间,您可以得到答案

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"]])

【讨论】:

  • 我尝试了该解决方案,它返回的数据与 tapply 相同,但任何返回 NA 的类型都被删除了。我仍然想首先了解这些 NA 值的来源。为什么在 tapply 和聚合中 sum() 与单独使用 sum() 不同?
  • aggregate 查看数据中实际存在的所有组合并返回它们的总和。另一方面,tapply 查看syno.wrngquarter.number 的所有可能组合,因此如果您的数据中不存在组合(例如ARCO1),它将返回NA 以表明它不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 2021-11-16
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多