在R中创建n个变量的所有m-way交互

时间:2014-03-11 05:41:55

标签: r combinations variable-names

我有七个变量,我想创建许多新变量,每个变量都是七个变量的交互项。将有双向5向交互。我计划分两步完成。

首先,创建变量名称的所有m-way组合。其次,将名称转换为实际变量。我已经完成了第一步,但不知道如何进行第二步。

我的第一步是:

xvec = c("white", "married", "inftype", "usecondom", "age", "edu", "part")

temp = t(combn(xvec, 2))
temp = paste(temp[,1], "*", temp[,2], sep="")

它给了我所有名称的双向组合/交互。但是,如何将名称转换为实际变量?我曾经使用get()或eval(parse())做类似的事情。但它们现在都没有用。

提前致谢!

1 个答案:

答案 0 :(得分:1)

关于第一步(并不是说您正在做的事情有问题),您可以创建如下名称:

temp <- combn(xvec, 2, FUN=paste, collapse=".")

这使得所有组合然后使用paste它将组合折叠在一起。我使用.,因为*在变量名中不是很好。您还可以检查?make.names,这是一个使字符串适合用作名称的函数。

第二步 您可以使用assign从存储在变量中的字符串创建变量。 (get是指您将现有变量的名称作为字符串并希望访问它时

尝试类似:

for(nm in make.names(temp)) {
  assign(nm, "Put something more interesting here")
}

您可以使用ls()

查看环境中的所有对象
ls()
## [1] "age.edu"           "age.part"          "edu.part"         
## [4] "inftype.age"       "inftype.edu"       "inftype.part"     
## [7] "inftype.usecondom" "married.age"       "married.edu"      
## [10] "married.inftype"   "married.part"      "married.usecondom"
## [13] "nm"                "temp"              "usecondom.age"    
## [16] "usecondom.edu"     "usecondom.part"    "white.age"        
## [19] "white.edu"         "white.inftype"     "white.married"    
## [22] "white.part"        "white.usecondom"   "xvec" 

现在你已经创建了很多变量。


正如评论一样,我想补充一下我可能会这样做。

您可以使用列表(myCombs)来保存所有对象,而不是使用大量对象填充环境。

myCombs <- combn(xvec, 2,simplify=FALSE, FUN = function(cmb) {
  res <- paste("This is the combination of", cmb[1], "and", cmb[2])
  res
})
##Add the names to the list items.
names(myCombs) <- combn(xvec, 2, FUN=paste, collapse=".")

我用这些术语来构造一个字符串。你可能想做更复杂的事情。如果您的环境中有xvec项作为变量,则可以使用get(cmb[1])get(cmb[1])在此处访问这些项目。

现在,您可以使用myCombs$NAMEmyComb[[NAME]]访问每个变量,或者甚至可以将整个列表attach(myComb)发送到您的环境。

 myCombs$edu.part
 ## [1] "This is the combination of edu and part"

我开始写一个小答案,但被带走了。希望这对你有帮助,

亚历