R 如何根据元素乘法添加列

R 如何根据元素乘法添加列,r,R,我有一个包含两列数字的表。我正试图生成一个新表,其中每列的结果都来自前面的data.frame列的元素相乘 例如,我有: df = data.frame(A=c(2,5,3), B=c(3,2,4)) print(df) A B 1 2 3 2 5 2 3 3 4 我需要: 3 2 4 2 6 4 8 5 15 10 20 3 9 6 12 这个怎么样?。根据data.frame的设置方式,您可能需要更改我将其子集设置

我有一个包含两列数字的表。我正试图生成一个新表,其中每列的结果都来自前面的
data.frame
列的元素相乘 例如,我有:

df = data.frame(A=c(2,5,3), B=c(3,2,4))
print(df)

  A B
1 2 3
2 5 2
3 3 4
我需要:

        3  2   4
    2   6  4   8
    5  15 10  20
    3   9  6  12

这个怎么样?。根据data.frame的设置方式,您可能需要更改我将其子集设置为A和B的方式

df = data.frame(A=c(2, 5, 3), B=c(3, 2, 4))
df


element_wise_prod <- function(p_df) {

    # use a more dynamic way to identify the two vectors of your dataframe
    A <- p_df[, 1]
    B <- p_df[, 2]
    result <- t(sapply(A, function(x) x * B))

    return(data.frame(result))
}

element_wise_prod(df)
df=data.frame(A=c(2,5,3),B=c(3,2,4))
df

元素方面的产品这个怎么样?。根据data.frame的设置方式,您可能需要更改我将其子集设置为A和B的方式

df = data.frame(A=c(2, 5, 3), B=c(3, 2, 4))
df


element_wise_prod <- function(p_df) {

    # use a more dynamic way to identify the two vectors of your dataframe
    A <- p_df[, 1]
    B <- p_df[, 2]
    result <- t(sapply(A, function(x) x * B))

    return(data.frame(result))
}

element_wise_prod(df)
df=data.frame(A=c(2,5,3),B=c(3,2,4))
df

元素方面的产品像这样的东西怎么样:

df = data.frame(A=c(2,5,3), B=c(3,2,4))

add_column <- function(df, source_column, value_key){

  modifiers <- df[value_key]  
  # Make names
  value_key <- paste0("value", as.numeric(unlist(modifiers)))

  # Make room
  df[value_key] <- NA
  column_i <- 1

  for(column in value_key){
    result <- df[source_column] * modifiers[column_i, 1]
    # Modify here if you want multiplication or sum
    df[column] <- result
    column_i <- column_i + 1
    }

  return(df)

}
基准 值得注意的是,尽管我的答案保留了列名,但它比发布的另一个答案慢得多。见下文

library(microbenchmark)


mbm <- microbenchmark("add_column" = {add_column(df, "A", "B")},
"element_wise" = {element_wise_prod(df)})

mbm
> mbm
Unit: microseconds
         expr      min       lq      mean    median       uq      max
   add_column 1055.127 1071.859 1125.2072 1088.6105 1188.004 1311.104
 element_wise  131.732  144.879  207.6434  159.3645  174.581 4813.909
 neval
   100
   100
库(微基准)
mbm mbm
单位:微秒
expr最小lq平均uq最大中值
添加列1055.127 1071.859 1125.2072 1088.6105 1188.004 1311.104
元件尺寸131.732 144.879 207.6434 159.3645 174.581 4813.909
内瓦尔
100
100

像这样的东西怎么样:

df = data.frame(A=c(2,5,3), B=c(3,2,4))

add_column <- function(df, source_column, value_key){

  modifiers <- df[value_key]  
  # Make names
  value_key <- paste0("value", as.numeric(unlist(modifiers)))

  # Make room
  df[value_key] <- NA
  column_i <- 1

  for(column in value_key){
    result <- df[source_column] * modifiers[column_i, 1]
    # Modify here if you want multiplication or sum
    df[column] <- result
    column_i <- column_i + 1
    }

  return(df)

}
基准 值得注意的是,尽管我的答案保留了列名,但它比发布的另一个答案慢得多。见下文

library(microbenchmark)


mbm <- microbenchmark("add_column" = {add_column(df, "A", "B")},
"element_wise" = {element_wise_prod(df)})

mbm
> mbm
Unit: microseconds
         expr      min       lq      mean    median       uq      max
   add_column 1055.127 1071.859 1125.2072 1088.6105 1188.004 1311.104
 element_wise  131.732  144.879  207.6434  159.3645  174.581 4813.909
 neval
   100
   100
库(微基准)
mbm mbm
单位:微秒
expr最小lq平均uq最大中值
添加列1055.127 1071.859 1125.2072 1088.6105 1188.004 1311.104
元件尺寸131.732 144.879 207.6434 159.3645 174.581 4813.909
内瓦尔
100
100

这是一个基函数,叫做outer(),你可以选择是加、乘、减等等

outer(A,B,"+")

这是一个基函数,叫做outer(),你可以选择是加、乘、减等等

outer(A,B,"+")

你能把你的答案修改得更清楚些吗?我想你的意思是你希望每个元素都是乘积?我希望结果是每个元素的和。2和3怎么和成6?5号和2号到10号?我被你的“我需要”矩阵弄糊涂了。你能把答案编辑得更清楚些吗?我想你的意思是你希望每个元素都是乘积?我希望结果是每个元素的和。2和3怎么和成6?5号和2号到10号?我被你的“我需要”矩阵弄糊涂了