【问题标题】:Call a custom function on each row of dataframe with multiple arguments from each row在每一行数据框上调用一个自定义函数,每行有多个参数
【发布时间】:2021-05-22 11:41:27
【问题描述】:

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

> 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

我尝试按照以下链接中的建议进行操作,但没有成功: Call apply-like function on each row of dataframe with multiple arguments from each row

如何在 R 中实现这一点?感谢您的帮助。

【问题讨论】:

    标签: r function dataframe


    【解决方案1】:

    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 package (v0.3.0) 于 2021-02-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 package (v0.3.0) 于 2021-02-19 创建

    【讨论】:

    • 非常感谢@starja。是否可以消除在函数(名称、数量、价格)中指定列名的需要?我的实际数据包含我需要在函数中使用的许多不同的列。所以我想知道是否可以传递所有列名而不需要指定它们,比如函数(...)?
    • 如果你使用.data代词,你可以改变它,这样你只需要在函数中指定名字
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2011-11-02
    • 2018-10-29
    • 2017-09-01
    相关资源
    最近更新 更多