3

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

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

4

3 回答 3

4

我认为您的问题不在于行。你的函数的编写方式,它需要一个对象。尝试添加 ac():

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

请注意,如果您不致力于使用自己的函数,则可以完全按行跳过,正如 Nettle 还指出的那样。rowSums已经以逐行方式处理数据帧,这就是它起作用的原因:

dt2 %>% mutate(nr_of_0s = rowSums(. == 0))
于 2018-10-17T21:02:22.070 回答
2

是否存在零的逻辑测试如下所示:

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

按行汇总 True 的数量

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
于 2018-10-16T02:14:35.273 回答
2

另一种不使用的方法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后缀使其返回一个整数向量。

于 2018-10-18T02:14:50.523 回答