【问题标题】:dplyr generate full set of dummy interaction terms for two factor variablesdplyr 为两个因子变量生成全套虚拟交互项
【发布时间】:2019-03-04 02:59:44
【问题描述】:

假设我有两个因子变量,一个在我的例子中包含多个因子 (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 个新的虚拟变量,如果 two.factor 为 1 且 multi.factor 是交互项中指定的因子,则为 1,否则为 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.factortwo.factor 实际因子,我只是使用整数来表示因子水平以保持复制简单。在我的实际数据中,multi.factor 是字符串。我怀疑tidyverse 解决方案不会在意。)

【问题讨论】:

    标签: r dplyr tidyr forcats


    【解决方案1】:

    假设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)
        )
      )
    

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 2020-03-21
      • 2012-08-10
      • 2022-07-31
      • 1970-01-01
      • 2018-05-28
      相关资源
      最近更新 更多