两个列表的逐元素乘法
Element wise multiplication of two lists
我有一个大数据框,我想按顺序将两个变量列表相乘以创建相关交互。
有人知道我如何按顺序迭代多个变量的乘法吗?理想情况下使用 data.table
或 purrr
我的数据看起来像这样
data(iris)
# I have two lists of variables
sepalvar <- c("Sepal.Length","Sepal.Width")
petalvar <- c("Petal.Length","Petal.Width")
#The final dataset should contain Sepal.Length*Petal.Length and a Sepal.Width*Petal.Width interactions. It would look something like this
setDT(iris)[,multlength:=Sepal.Length*Petal.Length
][,multwidth:=Sepal.Width*Petal.Width]
head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species multlength multwidth
1: 5.1 3.5 1.4 0.2 setosa 7.14 0.70
2: 4.9 3.0 1.4 0.2 setosa 6.86 0.60
3: 4.7 3.2 1.3 0.2 setosa 6.11 0.64
4: 4.6 3.1 1.5 0.2 setosa 6.90 0.62
5: 5.0 3.6 1.4 0.2 setosa 7.00 0.72
6: 5.4 3.9 1.7 0.4 setosa 9.18 1.56
有没有一种方法可以让我在两个列表中依次迭代它,从而创建具有可识别名称的变量?
非常感谢您的帮助
最佳
我们可以mget
为'sepalvar'和'petalvar'获取list
中对象的值,并使用Map
做*
对应的元素,并将其分配(:=
)到两个新列
library(data.table)
setDT(iris)[, c('multlength', 'multwidth')
:= Map(`*`, mget(sepalvar), mget(petalvar))]
-输出
head(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species multlength multwidth
#1: 5.1 3.5 1.4 0.2 setosa 7.14 0.70
#2: 4.9 3.0 1.4 0.2 setosa 6.86 0.60
#3: 4.7 3.2 1.3 0.2 setosa 6.11 0.64
#4: 4.6 3.1 1.5 0.2 setosa 6.90 0.62
#5: 5.0 3.6 1.4 0.2 setosa 7.00 0.72
#6: 5.4 3.9 1.7 0.4 setosa 9.18 1.56
或者另一种选择是使用 .SD
setDT(iris)[, c('multlength', 'multwidth') :=
.SD[, ..sepalvar] * .SD[, ..petalvar]]
我有一个大数据框,我想按顺序将两个变量列表相乘以创建相关交互。
有人知道我如何按顺序迭代多个变量的乘法吗?理想情况下使用 data.table
或 purrr
我的数据看起来像这样
data(iris)
# I have two lists of variables
sepalvar <- c("Sepal.Length","Sepal.Width")
petalvar <- c("Petal.Length","Petal.Width")
#The final dataset should contain Sepal.Length*Petal.Length and a Sepal.Width*Petal.Width interactions. It would look something like this
setDT(iris)[,multlength:=Sepal.Length*Petal.Length
][,multwidth:=Sepal.Width*Petal.Width]
head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species multlength multwidth
1: 5.1 3.5 1.4 0.2 setosa 7.14 0.70
2: 4.9 3.0 1.4 0.2 setosa 6.86 0.60
3: 4.7 3.2 1.3 0.2 setosa 6.11 0.64
4: 4.6 3.1 1.5 0.2 setosa 6.90 0.62
5: 5.0 3.6 1.4 0.2 setosa 7.00 0.72
6: 5.4 3.9 1.7 0.4 setosa 9.18 1.56
有没有一种方法可以让我在两个列表中依次迭代它,从而创建具有可识别名称的变量?
非常感谢您的帮助
最佳
我们可以mget
为'sepalvar'和'petalvar'获取list
中对象的值,并使用Map
做*
对应的元素,并将其分配(:=
)到两个新列
library(data.table)
setDT(iris)[, c('multlength', 'multwidth')
:= Map(`*`, mget(sepalvar), mget(petalvar))]
-输出
head(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species multlength multwidth
#1: 5.1 3.5 1.4 0.2 setosa 7.14 0.70
#2: 4.9 3.0 1.4 0.2 setosa 6.86 0.60
#3: 4.7 3.2 1.3 0.2 setosa 6.11 0.64
#4: 4.6 3.1 1.5 0.2 setosa 6.90 0.62
#5: 5.0 3.6 1.4 0.2 setosa 7.00 0.72
#6: 5.4 3.9 1.7 0.4 setosa 9.18 1.56
或者另一种选择是使用 .SD
setDT(iris)[, c('multlength', 'multwidth') :=
.SD[, ..sepalvar] * .SD[, ..petalvar]]