crossstab и xtabs генерируют нули вместо NAs

Я использовал следующие (примерные) данные и кросс-таблицу () для создания набора данных кросс-таблицы. Когда я использую этот метод, все комбинации столбцов x строк без данных становятся нулями в моем наборе выходных данных. Я бы хотел, чтобы они были НА, поскольку в наборе данных есть истинные нулевые значения, и я не могу их отличить иначе. Кроме того, я экспериментировал с xtabs () и получил ту же проблему. Мы очень ценим любые предложения по получению НА или другого метода.

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

person Keith W. Larson    schedule 04.08.2012    source источник


Ответы (3)


Поскольку при агрегировании с xtabs используется функция sum, вы можете использовать ее с настройкой по умолчанию na.rm = FALSE, используя tapply:

> 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 уже был фрейм данных.

person IRTFM    schedule 04.08.2012

Это сработало. Другие решения приветствуются!

WW1_XTAB <- as.data.frame(reshape(WW1_Data,idvar="Site_Name",timevar="Year",direction="wide"))
person Keith W. Larson    schedule 04.08.2012

Другой подход был бы

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

хотя это зависит от наличия только одной записи для каждой комбинации Участок / Год. Если бы было больше, вы могли бы использовать

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

но это даст 0, а не NA, если есть пропущенные значения (на основе того, что сумма списка нулевых элементов равна 0.

person seancarmody    schedule 04.08.2012