Смесь 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 находятсяNAsВыход из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.

Ответы на вопрос(1)

Ваш ответ на вопрос