首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交叉表和xtabs生成0而不是NAs

交叉表和xtabs生成0而不是NAs
EN

Stack Overflow用户
提问于 2012-08-04 19:00:56
回答 3查看 1.7K关注 0票数 1

我已经使用以下(示例)数据和交叉表()创建了一个交叉表数据集。当我使用这个方法时,所有没有数据的列x行组合在我的输出数据集中都变成了零。我希望它们是NAs,因为在数据集中有真正的零值,我无法区分它们otherwise.Additionally,我已经用xtabs()进行了实验,得到了同样的问题。对于获得NAs或其他方法的任何建议都是非常感谢的。

代码语言:javascript
复制
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)))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-05 02:53:07

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

代码语言:javascript
复制
> 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的结果已经是一个数据帧。

票数 3
EN

Stack Overflow用户

发布于 2012-08-04 20:32:53

这就起到了作用。欢迎使用其他解决方案!

代码语言:javascript
复制
WW1_XTAB <- as.data.frame(reshape(WW1_Data,idvar="Site_Name",timevar="Year",direction="wide"))
票数 1
EN

Stack Overflow用户

发布于 2012-08-05 07:24:26

另一种方法是

代码语言:javascript
复制
library(reshape2)
dcast(WW1_Data, Site_Name~Year)

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

代码语言:javascript
复制
library(reshape2)
dcast(WW1_Data, Site_Name~Year, sum)

但这将给出0而不是NA,其中有缺失值(基于零元素列表的和是0。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11808112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档