假设我有一个由三列组成的数据框
set.seed(24)
df1 <- data.frame(a=runif(10),b=runif(10),c=runif(10))
并希望拥有一个包含六列所有互动的内容:
a*a, a*b, a*c, b*c, b*b, c*c
我正在寻找的解决方案应该适用于任意数量的列,而不仅仅是三个
答案 0 :(得分:3)
让df
成为您的数据框,试试这个:
formula <- ~ I(a^2) + I(b^2) + I(c^2) + a:b + a:c + b:c - 1
X <- model.matrix(formula, df)
使用-1
删除拦截,即全部1列。使用I()
保护a^2
。
你是否有三向互动并不重要; model.matrix()
可以很轻松地处理它。
对于示例数据框,您可以获得如下内容:
> X
I(a^2) I(b^2) I(c^2) a:b a:c b:c
1 0.02830988 0.290128663 0.8060044 0.09062841 0.15105592 0.48357521
2 0.78597627 0.451852115 0.1003373 0.59594047 0.28082514 0.21292636
3 0.36190629 0.117679147 0.5325122 0.20637060 0.43899829 0.25033093
4 0.83645938 0.006638227 0.9812959 0.07451582 0.90598796 0.08070976
5 0.50038157 0.197485843 0.6194279 0.31435374 0.55673179 0.34975454
6 0.25813071 0.567147970 0.5028665 0.38262032 0.36028502 0.53404096
7 0.51074360 0.219564943 0.1966824 0.33487518 0.31694526 0.20780897
8 0.37611759 0.752857721 0.3169607 0.53213065 0.34527451 0.48849390
9 0.00562814 0.627098114 0.8408894 0.05940872 0.06879421 0.72616812
10 0.78306385 0.405336110 0.3063323 0.56338624 0.48977313 0.35237413
attr(,"assign")
[1] 1 2 3 4 5 6
我没有设置种子,因此测试时数字可能会有所不同。
模型矩阵对于在回归分析中构建模型矩阵很有用。在你的情况下,你只有数字数据;事实上,您还可以进行因子 - 数字交互和因子 - 因子交互。
答案 1 :(得分:2)
以下是combn
的另一个选项,其中列名称的组合一次取两个,将子集后的列与原始数据集的平方cbind
相乘。
res <- cbind(df1^2, do.call(cbind,combn(colnames(df1), 2,
FUN= function(x) list(df1[x[1]]*df1[x[2]]))))
colnames(res)[-(seq_len(ncol(df1)))] <- combn(colnames(df1), 2,
FUN = paste, collapse=":")
res
# a b c a:b a:c b:c
#1 0.08559952 0.365890531 0.008823729 0.17697473 0.02748285 0.056820059
#2 0.05057603 0.137444401 0.304984209 0.08337501 0.12419698 0.204739766
#3 0.49592997 0.451167798 0.525871254 0.47301970 0.51068123 0.487089495
#4 0.26925425 0.452905189 0.019023202 0.34920860 0.07156869 0.092820832
#5 0.43906475 0.102675746 0.049713853 0.21232357 0.14774167 0.071445132
#6 0.84721676 0.817486693 0.472890881 0.83221898 0.63296215 0.621757189
#7 0.07825199 0.039249934 0.005850588 0.05542008 0.02139673 0.015153719
#8 0.58342170 0.001953909 0.359676293 0.03376319 0.45808619 0.026509902
#9 0.64261164 0.250923183 0.397086073 0.40155468 0.50514566 0.315655035
#10 0.06488487 0.019260683 0.002174826 0.03535148 0.01187911 0.006472142
答案 2 :(得分:0)
这是我的解决方案,简洁明了,适用于任意数量的列:
n=ncol(df1)
combb=combn(n,2)
combb=cbind(combb, sapply(1:n, function(i) rep(i,2)))
res=apply(df1, 1, function(x) { apply(combb, 2, function(y) prod(x[y])) })
t(res)
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 0.17697473 0.02748285 0.056820059 0.08559952 0.365890531 0.008823729
# [2,] 0.08337501 0.12419698 0.204739766 0.05057603 0.137444401 0.304984209
# [3,] 0.47301970 0.51068123 0.487089495 0.49592997 0.451167798 0.525871254
# [4,] 0.34920860 0.07156869 0.092820832 0.26925425 0.452905189 0.019023202
# [5,] 0.21232357 0.14774167 0.071445132 0.43906475 0.102675746 0.049713853
# [6,] 0.83221898 0.63296215 0.621757189 0.84721676 0.817486693 0.472890881
# [7,] 0.05542008 0.02139673 0.015153719 0.07825199 0.039249934 0.005850588
# [8,] 0.03376319 0.45808619 0.026509902 0.58342170 0.001953909 0.359676293
# [9,] 0.40155468 0.50514566 0.315655035 0.64261164 0.250923183 0.397086073
# [10,] 0.03535148 0.01187911 0.006472142 0.06488487 0.019260683 0.002174826