用R中的向量确定的变量相乘

用R中的向量确定的变量相乘,r,apply,R,Apply,我需要手动为6*3个变量创建交互术语。我已经将这些变量的名称存储到两个向量中,让我们称它们为a和b。让我们称我的数据帧为df a <- c("var1","var2","var3") b <- c("varA","varB","varC","varD","varE","varF") 我可以手动创建18个不同的变量,如: df$var1.A <- df$var1*df$varA df$var1.B <- df$var1*df$varB df$var2.A <- df

我需要手动为6*3个变量创建交互术语。我已经将这些变量的名称存储到两个向量中,让我们称它们为a和b。让我们称我的数据帧为df

a <- c("var1","var2","var3")
b <- c("varA","varB","varC","varD","varE","varF")
我可以手动创建18个不同的变量,如:

df$var1.A <- df$var1*df$varA
df$var1.B <- df$var1*df$varB
df$var2.A <- df$var2*df$varA  
df$var2.B <- df$var2*df$varB
等等等等,但这显然是不雅观的,而且容易出错。我尝试过使用apply、sapply等软件,但还没有找到解决方案

更新

感谢@akrun,他给了我正确的答案。但是,我现在需要计算另一组交互,这次使用“transform”,因此基本语法是

df <- transform(df, var1.A = var1*varA)
df <- transform(df, var2.A = var2*varA)
df <- transform(df, var1.B = var1*varB)
df <- transform(df, var2.B = var1*varB)
其他17种相互作用也是如此。我试图将@akrun提供的代码改编成这个任务,但没有成功


我需要计算这些交互项的原因是,我使用Amelia乘以插补缺失数据。由于交互作用将出现在我的分析中,我需要在估计缺失值时包含它们,Amelia不会自动为我这样做。因此,我计算了18个相互作用项,并让阿米莉亚生成了一些插补数据集。然而,估算的相互作用项不一定与其组成项一致,后者也有Amelia估算的缺失数据。因此,为了进行分析,我需要根据完整值和插补值计算新的交互项。Amelia的开发人员建议通过“转换”来实现这一点,如果将其应用于整个Amelia对象,则可以在所有插补中工作。我无法用格式'df$var1'实现同样的效果。A我们可以通过在向量上执行expand.grid来一次完成这一切

基于向量的扩展组合创建新列名

nm1 <- sub("\\.var", ".", do.call(paste, c(ab, sep=".")))  
然后循环遍历每一行,对列进行子集划分,乘以并分配输出以创建新列

df[nm1] <- apply(ab , 1, FUN = function(x) Reduce(`*`, df[x]))
df
#var1 var2 var3 varA varB varC varD varE varF var1.A var2.A var3.A var1.B var2.B var3.B var1.C var2.C var3.C var1.D var2.D var3.D var1.E var2.E var3.E var1.F
#1    3    9    6    9    1    7    3    2    5     27     81     54      3      9      6     21     63     42      9     27     18      6     18     12     15
#2    3    3    4    2    5    1    3    7    4      6      6      8     15     15     20      3      3      4      9      9     12     21     21     28     12
#3    7    7    7    1    7    6    4    6    3      7      7      7     49     49     49     42     42     42     28     28     28     42     42     42     21
#4    5    8    7    5    2    6    2    7    2     25     40     35     10     16     14     30     48     42     10     16     14     35     56     49     10
#5    6    3    3    2    3    1    9    9    1     12      6      6     18      9      9      6      3      3     54     27     27     54     27     27      6
#  var2.F var3.F
#1     45     30
#2     12     16
#3     21     21
#4     16     14
#5      3      3
数据 容易

setNames(merge(a, b), c("col1", "col2"))
如果y是您的响应变量,则按如下方式运行线性模型:

lm(y ~ (var1 + var2 + var3) * (varA + varB + varC + varD + varE + varF), df)
这将给出第一组和第二组之间的截距、主要效果和相互作用,但不是在每一组中,这是我对你想要什么的理解

如果想法是使用a和b,那么:

给出:

Call:
lm(formula = y1 ~ (y2 + y3) * (x1 + x2 + x3 + x4), data = anscombe)

Coefficients:
(Intercept)           y2           y3           x1           x2           x3  
   259.9304       8.6943     -47.1185     -25.9360           NA           NA  
         x4        y2:x1        y2:x2        y2:x3        y2:x4        y3:x1  
    -0.2124       0.1627           NA           NA           NA       3.5765  
      y3:x2        y3:x3        y3:x4  
         NA           NA           NA  

这mapplyfunctionx,y{pastex,y,sep=*},a,b您的确切期望结果是什么?工作正常!但是我仍然没有得到OP想要的。@AndreElrico Thank,根据OP的描述,想要创建18列,在我扩展的“ab”中,它的长度是18列nm1[1]18@akrun万分感谢!这正是我所需要的。@akrun如果我再次打扰您,很抱歉,但我需要执行一组相关但不同的转换。我需要使用transform,因此基于您提供的数据的基本语法是:“df我现在更新了我的原始问题,因此它反映了这个额外的请求。再次感谢!我不想将其作为答案发布,因为它基于在模型背景中创建的数据集,但是如果他们真的需要可以使用的数据:data.framemodel.matrix~var1+var2+var3*varA+varB+varC+varD+varE+varF,df并忽略intercept列。还有一种更通用的方法:data.framemodel.matrixas.formulasprintf~%s*%s,pastea,collapse=+,pasteb,collapse=+,dfThanks G.Grothendieck!不完全是我需要的,但我不知道这种语法,它可能在未来非常有用!
lm(y ~ (var1 + var2 + var3) * (varA + varB + varC + varD + varE + varF), df)
fo <- sprintf("y ~ (%s) * (%s)", paste(a, collapse = "+"), paste(b, collapse = "+"))
lm(fo, df)
lm(y1 ~ (y2 + y3) * (x1 + x2 + x3 + x4), anscombe)
Call:
lm(formula = y1 ~ (y2 + y3) * (x1 + x2 + x3 + x4), data = anscombe)

Coefficients:
(Intercept)           y2           y3           x1           x2           x3  
   259.9304       8.6943     -47.1185     -25.9360           NA           NA  
         x4        y2:x1        y2:x2        y2:x3        y2:x4        y3:x1  
    -0.2124       0.1627           NA           NA           NA       3.5765  
      y3:x2        y3:x3        y3:x4  
         NA           NA           NA