r - 如何矢量化 R 中的子集函数?
问题描述
我很幸运地将某些函数矢量化,这对于干净的代码、避免循环和速度非常有用。
但是,我无法向量化任何基于函数输入对数据帧进行子集化的函数
例子
例如,这个函数在接收元素时运行良好
test_funct <- function(sep_wid, sep_len) {
iris %>% filter(Sepal.Width > sep_wid & Sepal.Length < sep_len) %>% .$Petal.Width %>% sum
}
test_funct(4, 6)
# [1] 0.7 # This works nicely
但是当试图提供向量作为这个函数的输入时:
sep_wid_vector <- c(4, 3.5, 3)
sep_len_vector <- c(6, 6, 6.5)
test_funct(sep_wid_vector, sep_len_vector)
[1] 9.1
但是所需的输出是与输入向量长度相同的向量,就好像该函数在每个向量的第一个元素上运行,然后是第二个,然后是第三个。IE
# 0.7 4.2 28.5
为方便起见,这里的输出好像这些都是单独运行的
test_funct(4, 6) # 0.7
test_funct(3.5, 6) # 4.2
test_funct(3, 6.5) # 28.5
如何向量化一个基于其输入对数据进行子集化的函数,以便它可以接收向量输入?
解决方案
问题是filter
需要向量输入,因此它将在Sepal.width
和Sepal.length
比较中回收向量。
一种方法是map2
从purrr
包中使用:
map2_dbl(sep_wid_vector, sep_len_vector, test_funct)
当然,您可以将其包装在一个函数中。您可能还需要考虑将数据框作为函数参数传入。
推荐阅读
- react-native - 对于使用“react-navigation/compat”的项目,无法将 react-navigation 从 5 迁移到 6
- javascript - 如何为多个握手域公开拍卖
- java - BeanCreationException:创建类路径资源中定义的名称为“configurationPropertiesBeans”的 bean 时出错
- algorithm - 根据年龄和性别将一组 n 人分成 m 个平衡的子组
- javascript - 如何使用 JavaScript 创建 HTML 电子邮件
- flutter - 处理方法调用失败;java.lang.IllegalArgumentException:给定字符串为空或为空
- sql - 当它们报告为空时如何替换/连接同一个表中的两个值?
- cupy - 分析时:什么是 API 调用:cupy 中的 cuLaunchKernel
- azure-web-app-service - 为 php web 应用程序创建 azure webapp
- javascript - React/Redux - 添加元素而不是替换状态