dplyr - применить пользовательскую функцию, используя rowwise () - PullRequest
0 голосов
/ 15 октября 2018

У меня есть фрейм данных, и я хочу посчитать количество нулей в каждой строке, используя строку dplyr.Что я делаю не так?

dt2 = data.frame(A = c(8, 6), B = c(0, 0), C = c(0, 5))
dt2
zerocount <- function(x) {sum(x == 0)}
library(dplyr)
dt2 %>% rowwise() %>% mutate(nr_of_0s = zerocount(A, B, C))

Приведенный выше код работает, если я заменяю нулевой счет (A, B, C) в строке выше, например, max (A, B, C).Что случилось?Спасибо!

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Я не думаю, что ваша проблема с рядной.То, как написана ваша функция, это ожидание одного объекта.Попробуйте добавить ac ():

dt2 %>% rowwise() %>% mutate(nr_of_0s = zerocount(c(A, B, C)))

Обратите внимание, что, если вы не намерены использовать свою собственную функцию, вы можете полностью пропустить строку, как отмечает Неттл.rowSums уже обрабатывает фреймы данных по строкам, поэтому это работает:

dt2 %>% mutate(nr_of_0s = rowSums(. == 0))
0 голосов
/ 18 октября 2018

Другой метод без использования rowwise():

mutate(dt2, zero_count = pmap_int(dt2, function(...) sum(c(...) == 0)))

>   A B C zero_count
> 1 8 0 0          2
> 2 6 0 5          1

pmap() - это функция purrr, которая берет элементы из списка (в данном случае это фрейм данных) и применяет функцию,В этом случае я просто применяю вашу функцию на лету.По умолчанию pmap() возвращает список, но использование суффикса _int возвращает целочисленный вектор.

0 голосов
/ 16 октября 2018

Логический тест на наличие нулей будет выглядеть следующим образом:

 dt2==0
         A    B     C
[1,] FALSE TRUE  TRUE
[2,] FALSE TRUE FALSE

Суммируйте число истин в строке

rowSums(dt2==0)
[1] 2 1

Имея это в виду, приведем решение для Tidyverse:

dt2 %>% 
  mutate(zero.count = rowSums(.==0) ) #<The dot is shorthand for dt2 

  A B C zero.count
1 8 0 0          2
2 6 0 5          1
...