1

我使用了以下(示例)数据和 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)))
4

3 回答 3

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已经是一个数据框。

于 2012-08-04T18:53:07.223 回答
1

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

WW1_XTAB <- as.data.frame(reshape(WW1_Data,idvar="Site_Name",timevar="Year",direction="wide"))
于 2012-08-04T12:32:53.000 回答
0

另一种方法是

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

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

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

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

于 2012-08-04T23:24:26.007 回答