首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将列与R中的子字符串相乘

将列与R中的子字符串相乘
EN

Stack Overflow用户
提问于 2018-06-19 02:57:58
回答 6查看 255关注 0票数 2

假设我有一个dataframe,它有多个组件及其属性列在多个列中,并且我想对这些列运行多个函数。我的方法是尝试以每个列标题中的子字符串为基础,但我还不能想出如何做到这一点。下面是数据框的示例。

代码语言:javascript
运行
复制
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

实际上,我希望将两个新列绑定到这个乘以Qty和P的数据帧的末尾,这样您就可以在末尾得到两个新列,如下所示。

代码语言:javascript
运行
复制
F_Total_1   F_Total_2
25          18
30          100

输入是动态的,所以有时可能是2个水果或10个水果放在特定的篮子里。但我可以弄清楚这部分,它更多的是试图弄清楚如何根据子字符串'1‘或'2’来乘以列。

我非常感谢您的帮助和您可能拥有的任何其他方法!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-06-19 03:11:17

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

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2018-06-19 03:08:42

创建数据

代码语言:javascript
运行
复制
library(data.table)
df <- fread("
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
")

df
#    Basket F_Type_1 F_Qty_1 F_P_1 F_Type_2 F_Qty_2 F_P_2
# 1:    AAA    Apple      10   2.5   Banana       9     2
# 2:    BBB    Peach       5   6.0    Melon      20     5

对于从1到sum(grepl('F_P_', names(df)))的数字,将F_Total_{number}设置为F_Qty_{number}*F_P_{number}

代码语言:javascript
运行
复制
for(i in seq(sum(grepl('F_P_', names(df)))))
  df[, paste0('F_Total_', i) := Reduce(`*`, .SD)
     , .SDcols = paste0(c('F_Qty_', 'F_P_'), i)]

df
#    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

或使用df作为data.frame的base R中

代码语言:javascript
运行
复制
for(i in seq(sum(grepl('F_P_', names(df)))))
  df[paste0('F_Total_', i)] <- Reduce(`*`, df[paste0(c('F_Qty_', 'F_P_'), i)])
票数 1
EN

Stack Overflow用户

发布于 2018-06-19 03:10:42

在base R中,您可以使用[[]]表单访问带有字符串的列,因此可以轻松地进行循环

代码语言:javascript
运行
复制
df <- read.table(text = "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",header = T)

for(i in 1:2)
{
  df[[paste0("F_Total_",i)]] <- as.numeric(df[[paste0("F_P_",i)]])*as.numeric(df[[paste0("F_Qty_",i)]])
}

  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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50915853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档