Смесь na.omit и na.pass с использованием агрегата?
У меня есть набор данных, содержащий данные испытаний прототипа продукта. Не все тесты были проведены на всех партиях, и не все тесты были выполнены с одинаковыми размерами выборки. Для иллюстрации рассмотрим этот случай:
> test <- data.frame(name = rep(c("A", "B", "C"), each = 4),
var1 = rep(c(1:3, NA), 3),
var2 = 1:12,
var3 = c(rep(NA, 4), 1:8))
> test
name var1 var2 var3
1 A 1 1 NA
2 A 2 2 NA
3 A 3 3 NA
4 A NA 4 NA
5 B 1 5 1
6 B 2 6 2
7 B 3 7 3
8 B NA 8 4
9 C 1 9 5
10 C 2 10 6
11 C 3 11 7
12 C NA 12 8
В прошлом мне приходилось иметь дело только со случаями несовпадающих повторений, что было легко сaggregate(cbind(var1, var2) ~ name, test, FUN = mean, na.action = na.omit)
(или настройка по умолчанию). Я получу средние для каждого лота более трех значений дляvar1
и более четырех значений дляvar2
.
К сожалению, это оставит меня с набором данных полностью отсутствующим лотомA
в этом случае:
aggregate(cbind(var1, var2, var3) ~ name, test, FUN = mean, na.action = na.omit)
name var1 var2 var3
1 B 2 6 2
2 C 2 10 6
Если я используюna.pass
однако я тоже не понимаю, чего хочу:
aggregate(cbind(var1, var2, var3) ~ name, test, FUN = mean, na.action = na.pass)
name var1 var2 var3
1 A NA 2.5 NA
2 B NA 6.5 2.5
3 C NA 10.5 6.5
Теперь я теряю хорошие данные, которые у меня были вvar1
так как он содержал случаиNA
.
Что я хотел бы это:
NA
как выводmean()
есливсе уникальные комбинацииvarN
~ name
находятсяNA
sВыход изmean()
если есть одно или несколько фактических значений дляvarN
~ name
Я предполагаю, что это довольно просто, но я просто не знаю как. Нужно ли использоватьddply
за что-то подобное? Если так ... причина, по которой я стараюсь избегать этого, в том, что я пишу действительно длинные эквивалентыaggregate()
вот так:
ddply(test, .(name), summarise,
var1 = mean(var1, na.rm = T),
var2 = mean(var2, na.rm = T),
var3 = mean(var3, na.rm = T))
Да ... так что результат этого, очевидно, делает то, что я хочу. Я оставлю вопрос в любом случае, если есть 1) способ сделать это сaggregate()
или 2) более короткий синтаксис дляddply
.