首页 > 解决方案 > 将变量交互作为例行程序创建

问题描述

从我的数据集中df,变量大小是数字(可以转换为small = 1, medium = 2, large = 3的数字)。

id <- c('1','2','3','4', '5')
size <- c('small', 'large', 'small', 'small', 'medium')
dest1 <- c('1', '0', '1', '0', '1')
dest2 <- c('0', '1', '1', '0', '1')
via1 <- c('1', '1', '0', '0', '0')
via2 <- c('1', '0', '1', '0', '1')
value <- c('4', '561', '310', '106', '8')

df <- data.frame(id, size, dest1, dest2, via1, via2, value)

我想以系统的方式进行交互,变量size与变量开头destvia分开,(在我的原始数据集中,我有数百个以这些词开头的变量)。我手动尝试了它(大小 x 虚拟),但是对于所有可能的交互都需要花费大量时间。

所以最后新的数据库要长什么样子df1。你有什么获得它的建议?

size_dest1 <- c('1', '0', '1', '1', '2')
size_dest2 <- c('0', '3', '1', '0', '2')
size_via1 <- c('1', '3', '0', '0', '0')
size_via2 <- c('1', '0', '1', '0', '2')
df1 <- data.frame(id, size, dest1, dest2, via1, via2, value, size_dest1, size_dest2, size_via1, size_via2)

有什么线索吗?

标签: rregressioninteractionlasso-regression

解决方案


一个选项是用 重新整形为“长”格式pivot_longer,重新编码“大小”中的值,对“大小”、“通过”列进行乘法运算,重新整形为“宽”格式并与原始数据连接

library(dplyr)
library(tidyr)
df <- df %>% 
      # // columns were all character.  So, changed the type
      type.convert(as.is = TRUE)


df %>% 
    # // reshape to long format
    pivot_longer(cols = dest1:via2, names_to = c(".value", 'grp'), 
           names_sep="(?<=[a-z])(?=[0-9])") %>% 
    # // recode the size column
    mutate(size = setNames(1:3, c('small', 'medium', 'large'))[size],  
       # // loop over the 'dest', 'via' columns, multiply with size 
       across(c(dest, via), ~ . * size, .names = "size_{.col}")) %>% 
   # // remove the columns not needed
   select(-size, -dest, -via) %>%
   # // reshape to wide format
   pivot_wider(names_from = grp, values_from = c(size_dest, size_via)) %>%
   # // join with the original dataset
   right_join(df) %>%
   # // reorder the columns in select
   select(names(df), everything())

-输出

# A tibble: 5 x 10
#     id size   dest1 dest2  via1  via2 size_dest_1 size_dest_2 size_via_1 size_via_2
#  <int> <chr>  <int> <int> <int> <int>       <int>       <int>      <int>      <int>
#1     1 small      1     0     1     1           1           0          1          1
#2     2 large      0     1     1     0           0           3          3          0
#3     3 small      1     1     0     1           1           1          0          1
#4     4 small      0     0     0     0           0           0          0          0
#5     5 medium     1     1     0     1           2           2          0          2

推荐阅读