Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 循环通过数据帧中的变量来创建交互_R_Dataframe - Fatal编程技术网

R 循环通过数据帧中的变量来创建交互

R 循环通过数据帧中的变量来创建交互,r,dataframe,R,Dataframe,我在一个数据框架中有100个分类变量,我想为我的预测模型创建交互。我创建了一个循环来完成它,但最终得到的是重复的 df <- data.frame(Col1=c("A","B","C"), Col2=c("F","G","H"), Col3=c("X","Y","Z")) 当我运行代码来创建与变量的交互时 vars <- colnames(df) for (i in vars) { for (j in

我在一个数据框架中有100个分类变量,我想为我的预测模型创建交互。我创建了一个循环来完成它,但最终得到的是重复的

df <- data.frame(Col1=c("A","B","C"), 
                 Col2=c("F","G","H"), 
                 Col3=c("X","Y","Z"))
当我运行代码来创建与变量的交互时

vars <- colnames(df) 
for (i in vars)  {
  for (j in vars) {
    if (i != j) {
      df[,c(paste0(i, j))] <- paste(df[[i]],df[[j]],sep='*')}}}

有没有办法删除这些DUP?

您的问题的可能答案:


您不需要为每对变量创建一个显式的交互列。相反,模型公式中的
Col1*Col2
将自动生成交互。例如,如果您的结果变量是
y
(这将是数据框中的一列),并且您想要一个包含其他列之间所有双向交互的回归公式,您可以执行以下操作:

form = reformulate(apply(combn(names(df)[-grep("y", names(df))], 2), 2, paste, collapse="*"), "y")

form
那么您的回归模型将是:

mod = lm(form, data=df)

一个选项可以是使用
combn
apply
功能。一个自定义函数将需要打印两个由
*
分隔的分类值(例如
A*F

#数据

df您使用的是什么建模软件包?有助于自动化的软件包,如<代码> GLMUTI。这将有助于看到您期望的输出,即您试图生成哪些组合。一般来说,如果您认为CyxCy和CyyCox作为重复,那么可能代替“代码> i!j
您可以在循环中使用
i
。@AntoniosK它可以工作。一个小小的改变,改变了一切!谢谢
You can do two-way interactions simply using `.*.` and arbitrary n-way interactions writing `.^n`. `formula(g)` will tell you the expanded version of the formula in each of these cases.
form = reformulate(apply(combn(names(df)[-grep("y", names(df))], 2), 2, paste, collapse="*"), "y")

form
y ~ Col1 * Col2 + Col1 * Col3 + Col2 * Col3
mod = lm(form, data=df)
# data
df <- data.frame(Col1=c("A","B","C"), 
                 Col2=c("F","G","H"), 
                 Col3=c("X","Y","Z"))

#function to paste two values together in A*F format
multiplyit <- function(x){
  paste(x, collapse = "*")
}

# Call combn using apply
df2 <- t(apply(df, 1, combn, 2, multiplyit))

#generate and set column names of df2
colnames(df2) <- paste("Col", combn(1:3, 2, paste, collapse="Col"), sep="")

#combine df and df2 to get the final df
df_final <- cbind(df, df2)

df_final
#  Col1 Col2 Col3 Col1Col2 Col1Col3 Col2Col3
#1    A    F    X      A*F      A*X      F*X
#2    B    G    Y      B*G      B*Y      G*Y
#3    C    H    Z      C*H      C*Z      H*Z