dplyr - 使用 rowwise() 应用自定义函数
dplyr - apply a custom function using rowwise()
我有一个数据框,想使用 dplyr 的 rowwise 计算每行中零的数量。我做错了什么?
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),上面的代码就可以工作。怎么了?
谢谢!
零是否存在的逻辑测试如下所示:
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
我认为您的问题不在于 rowwise。按照您编写函数的方式,它需要一个对象。尝试添加一个 c():
dt2 %>% rowwise() %>% mutate(nr_of_0s = zerocount(c(A, B, C)))
请注意,如果您不打算使用自己的函数,则可以完全跳过行向,正如 Nettle 还指出的那样。 rowSums
已经以按行方式处理数据帧,这就是它起作用的原因:
dt2 %>% mutate(nr_of_0s = rowSums(. == 0))
不使用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()
return 是一个列表,但使用 _int
后缀使其 return 成为一个整数向量。
我有一个数据框,想使用 dplyr 的 rowwise 计算每行中零的数量。我做错了什么?
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),上面的代码就可以工作。怎么了? 谢谢!
零是否存在的逻辑测试如下所示:
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
我认为您的问题不在于 rowwise。按照您编写函数的方式,它需要一个对象。尝试添加一个 c():
dt2 %>% rowwise() %>% mutate(nr_of_0s = zerocount(c(A, B, C)))
请注意,如果您不打算使用自己的函数,则可以完全跳过行向,正如 Nettle 还指出的那样。 rowSums
已经以按行方式处理数据帧,这就是它起作用的原因:
dt2 %>% mutate(nr_of_0s = rowSums(. == 0))
不使用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()
return 是一个列表,但使用 _int
后缀使其 return 成为一个整数向量。