Создать все 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"
Я начал писать небольшой ответ, но увлекся. Надеюсь, это поможет вам,
Алекс