簡體   English   中英

dplyr-使用rowwise()應用自定義函數

[英]dplyr - apply a custom function using 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),則上面的代碼有效。 怎么了? 謝謝!

我認為您的問題不在於按行。 函數的編寫方式,期望有一個對象。 嘗試添加ac():

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

請注意,如果您不打算使用自己的函數,則可以像Nettle一樣完全跳過按行。 rowSums已經按行方式處理數據幀,這就是為什么這樣做的原因:

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

邏輯測試是否為零看起來像:

 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

不使用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后綴使其返回整數向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM