【问题标题】:dplyr - apply a custom function using rowwise()dplyr - 使用 rowwise() 应用自定义函数
【发布时间】:2018-10-15 16:36:12
【问题描述】:

我有一个数据框,想使用 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),则上面的代码有效。怎么了? 谢谢!

【问题讨论】:

  • 我已阅读该链接,但没有看到直接适用于我的问题。
  • 我认为你的问题不在于行。你的函数的编写方式,它需要一个对象。尝试添加 c():dt2 %&gt;% rowwise() %&gt;% mutate(nr_of_0s = zerocount(c(A, B, C)))
  • 很遗憾您指定了rowwise。这也很有效dt2 %&gt;% mutate(zero.count = rowSums(.==0) )
  • @benc - 非常感谢您的评论。您能否将其作为回复提供,以便我为您投票?

标签: r dplyr rowwise


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

     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
    

    【讨论】:

    • 请对您的答案提供更多解释。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多