首页 > 解决方案 > 使用每行的多个参数在每一行数据帧上调用自定义函数

问题描述

我有一个包含多个数字和字符列的数据框。例如,

> 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 中实现这一点?谢谢你的帮助。

标签: rfunctiondataframe

解决方案


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 日创建


推荐阅读