交叉表和xtabs生成零而不是NA

时间:2012-08-04 11:00:56

标签: r crosstab na

我使用了以下(示例)数据和crosstab()来创建跨表数据集。当我使用此方法时,没有数据的所有列x行组合在我的输出数据集中变为零。我希望它们是NA,因为数据集中存在真正的零值,否则我无法区分它们。另外,我已经尝试了xtabs()并得到了同样的问题。任何有关获取NAs或其他方法的建议都非常受欢迎。

WW1_Data <- structure(list(Site_Name = c("Alnön", "Alnön", "Alnön", "Ammarnäs",
"Ammarnäs", "Anjan", "Anjan", "Bäcksand", "Bäcksand", "Fittjebodarna",
"Fittjebodarna", "Flatruet", "Flatruet", "Flatruet", "Flatruet",
"Glen", "Glen", "Glen", "Idre", "Idre"), Year = c("1996", "2000",
"2010", "1996", "2011", "2009", "2010", "2000", "2010", "2008",
"2009", "2008", "2009", "2010", "2011", "2008", "2009", "2010",
"1996", "2010"), WW1_Pct_2 = c(0.307692307692308, 0.260869565217391,
0.0833333333333333, 0.75, 0.8, 0.52, 0.5, 0.0833333333333333,
0.375, 0.4, 0.423076923076923, 0.85, 0.483870967741935, 0.56,
0.58, 0.777777777777778, 0.555555555555556, 0.521739130434783,
0.4, 0)), .Names = c("Site_Name", "Year", "WW1_Pct_2"), row.names = c(3L,
4L, 5L, 8L, 9L, 10L, 11L, 15L, 16L, 28L, 29L, 30L, 31L, 32L,
33L, 42L, 43L, 44L, 59L, 60L), class = "data.frame")

xtabs(WW1_Pct_2 ~ Site_Name + Year, WW1_Data)

## alternatively ##

library(ecodist)
WW1_XTAB  <- data.frame(with(WW1_Data, crosstab(Site_Name, Year, WW1_Pct_2)))

3 个答案:

答案 0 :(得分:3)

由于与xtabs聚合时使用的函数是sum,因此可以使用tapply将其默认设置为na.rm = FALSE:

> with(WW1_Data, tapply(WW1_Pct_2, list(Site_Name,  Year), sum )  )
                      1996          2000         2008         2009          2010 2011
Alnön         0.3076923077 0.26086956522           NA           NA 0.08333333333   NA
Ammarnäs      0.7500000000            NA           NA           NA            NA 0.80
Anjan                   NA            NA           NA 0.5200000000 0.50000000000   NA
Bäcksand                NA 0.08333333333           NA           NA 0.37500000000   NA
Fittjebodarna           NA            NA 0.4000000000 0.4230769231            NA   NA
Flatruet                NA            NA 0.8500000000 0.4838709677 0.56000000000 0.58
Glen                    NA            NA 0.7777777778 0.5555555556 0.52173913043   NA
Idre          0.4000000000            NA           NA           NA 0.00000000000   NA

表有as.data.frame方法(这是一种特殊的矩阵),它是tapply返回的对象类。由于as.data.frame的结果已经是数据框,因此您对reshape的使用是多余的。

答案 1 :(得分:1)

这就是诀窍。欢迎其他解决方案!

WW1_XTAB <- as.data.frame(reshape(WW1_Data,idvar="Site_Name",timevar="Year",direction="wide"))

答案 2 :(得分:0)

另一种方法是

library(reshape2)
dcast(WW1_Data, Site_Name~Year)

虽然这取决于每个站点/年组合只有一个条目。如果还有更多可以使用

library(reshape2)
dcast(WW1_Data, Site_Name~Year, sum)

但是这会给出0而不是NA,其中存在缺失值(基于零元素列表的总和为0。