Создать все m-способ взаимодействия n переменных в R

У меня есть семь переменных, и я хочу создать много новых переменных, каждая из которых является членом взаимодействия семи переменных. Там будет 2-х до 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 ответ

Что касается первого шага (не то, что что-то не так с тем, что вы делаете), вы можете создать имена следующим образом:

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$NAME, или же myComb[[NAME]]или вы можете даже attach(myComb) весь список в вашей среде.

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

Я начал писать небольшой ответ, но увлекся. Надеюсь, это поможет вам,

Алекс

Другие вопросы по тегам