首页 > 解决方案 > 将列乘以 R 中的子字符串

问题描述

假设我有一个数据框,其中包含多个组件及其在多个列中列出的属性,并且我想针对这些列运行多个函数。我的方法是尝试将它基于每个列标题中的子字符串,但我无法弄清楚如何做到这一点。以下是数据框的示例。

Basket   F_Type_1   F_Qty_1   F_P_1   F_Type_2   F_Qty_2   F_P_2 
AAA       Apple     10        2.5     Banana     9         2
BBB       Peach     5         6       Melon      20        5

我本质上想将两个新列 cbind 到该数据帧的末尾,将 Qty 和 P 相乘,这样您就可以在末尾得到两个新列,如下所示。

F_Total_1   F_Total_2
25          18
30          100

输入是动态的,因此有时它可能是某些篮子中的 2 个水果或 10 个水果。但我可以弄清楚那部分,它更想弄清楚如何根据子字符串“1”或“2”来乘以列。

感谢您的所有帮助以及您可能拥有的任何其他方法!

标签: rdataframesubstr

解决方案


我们创建一个函数来查找特定名称,然后计算行乘积。这个函数的重头戏是mapply函数。我们添加最后一步来重命名结果data.frame

fun1 <- function(data){
  qty_names <- names(data)[grepl(pattern = "Qty", x = names(data))]

  p_names <- names(data)[grepl(pattern = "P", x = names(data))]

  setNames(
    data.frame(
      mapply(qty_names, p_names, 
             FUN = function(n1, n2) apply(data[c(n1,n2)], 1, prod))),
      paste0('F_Total_', 1:length(p_names)))


}

cbind(dat, fun1(dat))

  Basket F_Type_1 F_Qty_1 F_P_1 F_Type_2 F_Qty_2 F_P_2 F_Total_1 F_Total_2
1    AAA    Apple      10   2.5   Banana       9     2        25        18
2    BBB    Peach       5   6.0    Melon      20     5        30       100

推荐阅读