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 一起使用,而不是数据本身。
有人对问题可能有什么建议吗?
提前致谢
根据您的具体需求,我为您提供了两种可能的解决方案。如果您只对每个 Type
和 Quarter
的正 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"]])
我有一个数据集,其中包含多个年份、地区、季度和类型的事件发生情况。示例:
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 一起使用,而不是数据本身。
有人对问题可能有什么建议吗?
提前致谢
根据您的具体需求,我为您提供了两种可能的解决方案。如果您只对每个 Type
和 Quarter
的正 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"]])