假设我有一个两因素变量,一个在我的例子中有许多因素(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.factor或two.factor的实际因子,我只是使用整数来表示因子级别,以保持复制的简单性。在我的实际数据中,multi.factor是字符串。我怀疑tidyverse解决方案不会在意。)
发布于 2019-01-11 20:23:15
假设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)
)
)https://stackoverflow.com/questions/54139048
复制相似问题