r - 使用每行的多个参数在每一行数据帧上调用自定义函数
问题描述
我有一个包含多个数字和字符列的数据框。例如,
> df <- data.frame(Name=c('John','Tom','Sarah'), Quantity=c(3,4,5), Price=c(5,6,7))
> df
Name Quantity Price
1 John 3 5
2 Tom 4 6
3 Sarah 5 7
我想编写一个函数来检查姓名是 John 还是 Tom,并计算 Sales=Quantity*Price。该函数如下所示:
myFunc <- function(x) {
if (Name %in% c('John','Tom') {
Sales <- Quantity * Price
}
}
我想将数据帧的每一行发送到函数以获得以下输出:
Name Quantity Price Sales
1 John 3 5 15
2 Tom 4 6 24
3 Sarah 5 7 NA
我尝试按照以下链接中的建议进行操作,但没有成功: 在每行数据帧上调用类似应用的函数,每行有多个参数
我怎样才能在 R 中实现这一点?谢谢你的帮助。
解决方案
在R
中,尤其是在您的情况下,您可以使用矢量化函数。它们适用于完整的向量,因此您不必为每一行单独应用该函数,而是可以直接提供完整的列:
df <- data.frame(Name=c('John','Tom','Sarah'), Quantity=c(3,4,5), Price=c(5,6,7))
my_vectorised_fun <- function(name, quantity, price) {
sales <- quantity * price
# check for which the name doesn't fit
index_names <- !name %in% c("John", "Tom")
sales[index_names] <- NA
sales
}
library(dplyr)
df %>%
mutate(Sales = my_vectorised_fun(Name, Quantity, Price))
#> Name Quantity Price Sales
#> 1 John 3 5 15
#> 2 Tom 4 6 24
#> 3 Sarah 5 7 NA
由reprex 包(v0.3.0)于 2021 年 2 月 19 日创建
编辑
这是一个版本,您将完整的.data
代词传递给函数,并且只需要在函数中指定名称:
df <- data.frame(Name=c('John','Tom','Sarah'), Quantity=c(3,4,5), Price=c(5,6,7))
my_vectorised_fun <- function(all_data) {
sales <- all_data[["Quantity"]] * all_data[["Price"]]
# check for which the name doesn't fit
index_names <- !all_data[["Name"]] %in% c("John", "Tom")
sales[index_names] <- NA
sales
}
library(dplyr)
df %>%
mutate(Sales = my_vectorised_fun(.data))
#> Name Quantity Price Sales
#> 1 John 3 5 15
#> 2 Tom 4 6 24
#> 3 Sarah 5 7 NA
由reprex 包(v0.3.0)于 2021 年 2 月 19 日创建
推荐阅读
- javascript - React Native this.state.questions.map() 不是函数
- react-native - React Native - 如何像 iOS 或 instagram 一样进行模糊视图?
- javascript - (jQuery) 不能多次附加同一个对象
- http - cookie 是如何物理存储的?
- django - 生成AZ,链接到同一个ClassBasedView并进行搜索
- flutter - Flutter 自定义画家类
- html - 在滑块中拟合视频(Bootstrap 4.0)
- linux - 对现有或已安装的根文件系统进行加密
- python - Python递归打印嵌套哈希
- scala - 了解 Stream Scala 交错转换行为