无法使用 map_dbl 进行总结

问题描述

我试图对 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 不需要检查 elseif 条件将始终满足。

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,您可以在其中指定要应用于 TRUEFALSE 条件的单独函数。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...