dplyr генерирует полный набор фиктивных членов взаимодействия для двух факторных переменных - PullRequest
0 голосов
/ 11 января 2019

Допустим, у меня есть две факторные переменные, одна из которых в моем случае имеет много факторов (multi.factor), а другая, которая имеет только два фактора (two.factor), и сама является фиктивной.

df <- data.frame(two.factor = rep(c(0,1), 4)) %>%
  mutate(multi.factor = ceiling(row_number()/2))

df

#>   two.factor multi.factor
#> 1          0            1
#> 2          1            1
#> 3          0            2
#> 4          1            2
#> 5          0            3
#> 6          1            3
#> 7          0            4
#> 8          1            4

Как я могу использовать dplyr или другой метод tidyverse для создания набора фиктивных терминов взаимодействия для этих двух переменных? Другими словами, мне нужно 4 * 1 = 4 новых фиктивных переменных, которые равны 1, если two.factor равно 1, а multi.factor - это фактор, названный в термине взаимодействия, иначе 0. Долгий путь для этого будет:

df %<>%
  mutate(interact.1 = case_when(multi.factor == 1 & two.factor == 1 ~ 1, TRUE ~ 0)) %>%
  mutate(interact.2 = case_when(multi.factor == 2 & two.factor == 1 ~ 1, TRUE ~ 0)) %>%
  mutate(interact.3 = case_when(multi.factor == 3 & two.factor == 1 ~ 1, TRUE ~ 0)) %>%
  mutate(interact.4 = case_when(multi.factor == 4 & two.factor == 1 ~ 1, TRUE ~ 0))

df
#>   two.factor multi.factor interact.1 interact.2 interact.3 interact.4
#> 1          0            1          0          0          0          0
#> 2          1            1          1          0          0          0
#> 3          0            2          0          0          0          0
#> 4          1            2          0          1          0          0
#> 5          0            3          0          0          0          0
#> 6          1            3          0          0          1          0
#> 7          0            4          0          0          0          0
#> 8          1            4          0          0          0          1

(Я еще не сделал фактические факторы multi.factor или two.factor, и я просто использую целые числа для представления уровней факторов для упрощения репликации. В моих реальных данных multi.factor - это строки. Я подозреваю, решение tidyverse не волнует.)

1 Ответ

0 голосов
/ 11 января 2019

Предполагая, что multi.factor является фактором, вы можете использовать map, чтобы создать новый столбец для каждого уровня:

library(tidyverse)

df <- data.frame(two.factor = rep(c(0,1), 4)) %>%
  mutate(multi.factor = as.factor(ceiling(row_number()/2)))

df %>% 
  bind_cols(
    map( levels(df$multi.factor),
         function(x)
           df %>% transmute(!!paste0("interact.",x) := (multi.factor == x) * two.factor)
    )
  )
...