r - 将列乘以 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”来乘以列。
感谢您的所有帮助以及您可能拥有的任何其他方法!
解决方案
我们创建一个函数来查找特定名称,然后计算行乘积。这个函数的重头戏是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
推荐阅读
- pyspark - Pyspark,TypeError:“列”对象不可调用
- git - 如何在git中合并两个功能分支
- android - 你能解释一下为什么 Android Studio 中的 Layout 与真实设备上的 Layout 不同吗?
- asp.net-core - LinkedIn 用户个人资料图像 URL 中的参数
- javascript - 页面完全加载后运行自定义javascript?
- c# - C# 在 lambda 表达式中使用动态字符串或查询
- javascript - React.js ... ReactCSSTransitionGroup 是否有 CDN?
- spring - 在 Thymeleaf 和 Spring Boot 中提交表单时如何检查复选框是否被选中?
- python - 尝试比较 2 个大文件的行并保持匹配但没有匹配的行
- amazon-web-services - 如何使用 CloudFormation 启用 M out of N CloudWatch 警报?