Вот базовый метод R с model.matrix
и sub
.
# construct desired data.frame
dat <- as.data.frame(model.matrix(~Col2 + Col3 + Col1:(Col4 + Col5) - 1, df1))
# construct desired names
names(dat) <- sub("^.*(.):(.*)$", "\\2\\1", names(dat))
Здесь формула в model.matrix
используется для построения желаемой структуры. -1
в конце гарантирует, что каждый уровень взаимодействия появляется. Поскольку функция возвращает матрицу, используйте as.data.frame
для ее преобразования. Затем используйте sub
и регулярное выражение, чтобы изменить имена переменных взаимодействия. Это возвращает
dat
Col2 Col3 Col4A Col4B Col5A Col5B
1 1 1 10 0 90 0
2 1 2 20 0 100 0
3 1 3 30 0 110 0
4 1 4 40 0 120 0
5 1 1 0 50 0 130
6 1 2 0 60 0 140
7 1 3 0 70 0 150
8 1 4 0 80 0 160
Обратите внимание, что если вы планируете использовать это непосредственно в модели, вы, вероятно, не хотите преобразовывать его в data.frame. В случае если матрица остается, замените names(dat)
на colnames(dat)
.
Используйте sub("^.*(.):(.*)$", "\\2_\\1", names(dat))
для включения подчеркивания.
Чтобы сделать первую часть более динамичной, вы можете создать формулу для функции model.matrix
с помощью функции, подобной этой:
f <- function(x) as.formula(paste0("~ Col2 + Col3 + Col1:(",
paste(paste0("Col", x), collapse=" + "), ") -1"))
Тогда попробуйте,
f(4:7)
~Col2 + Col3 + Col1:(Col4 + Col5 + Col6 + Col7) - 1
<environment: 0x3d2b598>