使用" transform"创建由向量标识的多个交互项。在R

时间:2018-03-08 08:20:38

标签: r transform apply

我正在使用Amelia来增加错误数据的估算。由于交互将在我的分析中进行,我需要在估算缺失值时包含它们,而Amelia不会自动为我做这些。因此,我计算了18个交互项,并让Amelia生成多次估算的数据。然而,推算的互动术语并不一定与其组成术语一致,后者也缺少Amelia推测的数据。因此,as suggested in another post,为了运行我的分析,我需要根据完整值和估算值计算新的交互项。 Amelia的开发人员建议通过' transform'来实现这一点,如果应用于整个Amelia对象,则可以在所有的估算中使用。

所以从本质上讲,我的问题是这个。我有一个数据帧,df和两个变量向量:

a <- c("var1","var2","var3")
b <- c("varA","varB","varC","varD","varE","varF")

我可以使用&#39; transform&#39;手动创建18个互动术语,如:

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)

依此类推。但是,我宁愿使用&#39; apply&#39;家人一气呵成,避免错误。

有任何建议吗?

1 个答案:

答案 0 :(得分:0)

目前尚不清楚“Amelia”会解析哪些功能。一个选项是创建一个将在for循环中解析的表达式,并将输出分配给初始对象'df'

#create combination of variables as a 2 column dataset
ab <- expand.grid(a, b, stringsAsFactors = FALSE)

#create the column names of the new columns
nm1 <- sub("\\.var", ".", do.call(paste, c(ab, sep=".")))  

#create a pasted expression 
ab1 <- sprintf("transform(df, %s = %s*%s)", nm1, ab[,1], ab[,2]) 

#evaluate the expression within for loop and assign it back to 'df'
for(i in seq_along(ab1)) df <- eval(parse(text = ab1[i]))

-output

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
#1    3    9    6    9    1    7    3    2    5     27     81     54      3      9      6     21     63     42      9     27     18      6     18
#2    3    3    4    2    5    1    3    7    4      6      6      8     15     15     20      3      3      4      9      9     12     21     21
#3    7    7    7    1    7    6    4    6    3      7      7      7     49     49     49     42     42     42     28     28     28     42     42
#4    5    8    7    5    2    6    2    7    2     25     40     35     10     16     14     30     48     42     10     16     14     35     56
#5    6    3    3    2    3    1    9    9    1     12      6      6     18      9      9      6      3      3     54     27     27     54     27
#  var3.E var1.F var2.F var3.F
#1     12     15     45     30
#2     28     12     12     16
#3     42     21     21     21
#4     49     10     16     14
#5     27      6      3      3

数据

set.seed(24)
df <- as.data.frame(matrix(sample(1:9, 5 * 9, replace = TRUE), 
     5, 9, dimnames = list(NULL, c(a, b))))