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