如何根据元素乘法添加列

时间:2019-05-10 13:06:12

标签: 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

3 个答案:

答案 0 :(得分:1)

如何?尽管可能取决于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)

答案 1 :(得分:1)

这是一个基本函数,称为外部(),您可以选择是加,乘,减,等等。

outer(A,B,"+")

答案 2 :(得分:0)

怎么样呢?

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)

}

哪个给

> add_column(df, "A", "B")
  A B value3 value2 value4
1 2 3      6      4      8
2 5 2     15     10     20
3 3 4      9      6     12

基准

值得注意的是,尽管我的答案保留了列名,但比其他答案要慢得多。见下文。

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