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号?我被你的“我需要”矩阵弄糊涂了