dplyr-使用rowwise()应用自定义函数

时间:2018-10-15 16:36:12

标签: r dplyr rowwise

我有一个数据帧,想使用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))

如果我用例如max(A,B,C)替换上一行中的zerocount(A,B,C),则上面的代码有效。怎么了? 谢谢!

3 个答案:

答案 0 :(得分:2)

我认为您的问题不在于按行。函数的编写方式,期望有一个对象。尝试添加c():

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

请注意,如果您不打算使用自己的函数,则可以像Nettle一样完全跳过行。 rowSums已经以行方式处理数据帧,这就是为什么这样做的原因:

dt2 %>% mutate(nr_of_0s = rowSums(. == 0))

答案 1 :(得分:1)

对零是否存在进行逻辑测试看起来像:

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

按行求和的总数

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

考虑到这一点,这是一个整洁的解决方案:

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

答案 2 :(得分:1)

不使用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使其返回一个整数向量。