【问题标题】:crosstab and xtabs generates zeros instead of NAscrosstab 和 xtabs 生成零而不是 NA
【发布时间】:2012-08-02 05:36:19
【问题描述】:

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

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

【问题讨论】:

    标签: r crosstab na


    【解决方案1】:

    由于使用 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 的结果已经是一个数据框。

    【讨论】:

      【解决方案2】:

      这成功了。欢迎其他解决方案!

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

      【讨论】:

        【解决方案3】:

        另一种方法是

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

        尽管这依赖于每个站点/年份组合只有一个条目。如果有更多你可以使用

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

        但这会在缺失值的情况下给出 0 而不是 NA(基于零元素列表的总和为 0。

        【讨论】:

          猜你喜欢
          • 2012-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-09
          • 2016-06-04
          • 1970-01-01
          • 2018-10-01
          相关资源
          最近更新 更多