Используя dplyr суммировать каждый () с is.на()

я пытаюсь обернуть некоторую магию dplyr внутри функции для получения данных.кадр, который потом печатать с xtable.

конечная цель состоит в dplyr версия этой работа и чтение вокруг, я наткнулся на очень полезное summarise_each() функция, которая после подстановки с regroup() (так как это находится в функции), я могу использовать, чтобы получить все столбцы.

проблема, с которой я столкнулся (до сих пор), заключается в вызове is.na() изнутри summarise_each(funs(is.na)) как мне сказали Error: expecting a single value.

я целенаправлено не публикация моей функции еще только, но минимальный пример следует (NB-это использует group_by() в то время как в моей функции я заменить regroup())...

library(dplyr)
library(magrittr)
> t <- data.frame(grp = rbinom(10, 1, 0.5),
                a = as.factor(round(rnorm(10))),
                b = rnorm(10),
                c = rnorm(10))
t %>%
group_by(grp) %>%  ## This is replaced with regroup() in my function
summarise_each(funs(is.na))
Error: expecting a single value

запуск этого не удается, и его вызов is.na() это проблема, так как, если я вместо этого разработаю количество наблюдений в каждом (необходимое для получения доли отсутствующих), это работает...

> t %>%
group_by(grp) %>%  ## This is replaced with regroup() in my function
summarise_each(funs(length))
Source: local data frame [2 x 4]

  grp a b c
1   0 8 8 8
2   1 2 2 2

реальная проблема хотя это то, что мне не нужно просто is.na() внутри каждого столбца, но sum(is.na()) согласно связанному примеру, так что я действительно хотел бы...

> t %>%
group_by(grp) %>%  ## This is replaced with regroup() in my function
summarise_each(funs(propmiss = sum(is.na) / length))

но проблема в том, что sum(is.na) не работает, как я ожидаю (вероятно, потому, что мое ожидание неверно!)...

> t %>%
group_by(grp) %>%  ## This is replaced with regroup() in my function
summarise_each(funs(nmiss = sum(is.na)))
Error in sum(.Primitive("is.na")) : invalid 'type' (builtin) of argument

я пытался позвонить is.na() явно с скобками, но это тоже возвращает ошибку...

> t %>%
+ group_by(grp) %>%  ## This is replaced with regroup() in my function
+ summarise_each(funs(nmiss      = sum(is.na())))
Error in is.na() : 0 arguments passed to 'is.na' which requires 1

любые советы или указатели на документацию были бы очень благодарны полученный.

спасибо,

slackline

1 ответов


вот возможность, проверенная на небольшом наборе данных с некоторыми NA:

df <- data.frame(a = rep(1:2, each = 3),
                 b = c(1, 1, NA, 1, NA, NA),
                 c = c(1, 1, 1, NA, NA, NA))

df
#   a  b  c
# 1 1  1  1
# 2 1  1  1
# 3 1 NA  1
# 4 2  1 NA
# 5 2 NA NA
# 6 2 NA NA


df %>% 
  group_by(a) %>%
  summarise_each(funs(sum(is.na(.)) / length(.)))
#   a         b c
# 1 1 0.3333333 0
# 2 2 0.6666667 1

и потому, что вы попросили указатели на документацию:. относится к каждой части данных, и используется в некоторых примеры на ?summarize_each. Это описано в Аргументы на ?funs в качестве "фиктивного параметра" и используется примеры. The . также кратко описано в Аргументы из ?do: "... можно использовать . для обозначения текущей группы"