我有一个包含两列数字的表。我正在尝试生成一个新表,其中每列的结果来自先前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
答案 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