Как добавить столбцы в соответствии с поэлементным умножением - PullRequest
0 голосов
/ 10 мая 2019

У меня есть таблица, которая содержит два столбца чисел. Я пытаюсь сгенерировать новую таблицу, в которой результат каждого столбца получен из поэлементного умножения предыдущих столбцов 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 ]

1 голос
/ 13 мая 2019

Это базовая функция, она называется external (), вы можете выбрать, добавлять, умножать, вычитать и т. Д.

outer(A,B,"+")
1 голос
/ 11 мая 2019

Как насчет этого? Возможно, вам придется изменить способ подмножества в A и B, хотя это зависит от того, как настроен ваш data.frame.

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)
0 голосов
/ 11 мая 2019

Примерно так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...