问题描述
我试图对 iris
中的所有数字变量求和,而不是对非数字变量求和。
然而,这不起作用:
iris %>% map_dbl(function(x) if(is.numeric(x)) sum(x))
为什么这不起作用?如果我先删除非数字变量,它会起作用,如下
iris[1:4] %>% map_dbl(function(x) if(is.numeric(x)) sum(x))
对于这种情况,我们还可以使用 map_dbl
吗?
解决方法
以下不起作用,因为如果变量不是数字变量,您没有指定 R 应该做什么。这就是您遇到错误的原因。
iris %>% map_dbl(function(x) if(is.numeric(x)) sum(x))
但是,如果您确实指定了 else
,它将起作用:
iris %>% map_dbl(function(x) if(is.numeric(x)) sum(x) else NA)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
876.5 458.6 563.7 179.9 NA
如果过滤掉非数字变量,它会起作用,因为 R 不需要检查 else
。 if
条件将始终满足。
iris[1:4] %>% map_dbl(function(x) if(is.numeric(x)) sum(x))
或者,您可以使用 dplyr
:
library(dplyr)
iris %>% summarize(across(is.numeric,sum))
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 876.5 458.6 563.7 179.9
,
您还可以查看 map_if
,您可以在其中指定要应用于 TRUE
和 FALSE
条件的单独函数。
purrr::map_if(iris,is.numeric,sum,.else = function(x) return(NA))
#$Sepal.Length
#[1] 876.5
#$Sepal.Width
#[1] 458.6
#$Petal.Length
#[1] 563.7
#$Petal.Width
#[1] 179.9
#$Species
#[1] NA