微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建可变交互作为例行程序

如何解决创建可变交互作为例行程序

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

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

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

我想以系统的方式交互,变量 size 分别以 destvia 开头,(在我的原始数据集中,我有数百个以这些词开头的变量)。我手动尝试过(size x dummy),但是对于所有可能的交互都需要花费很多时间。

所以最后新数据库必须看起来像 df1。您对获得它的建议是什么?

size_dest1 <- c('1','2')
size_dest2 <- c('0','2')
size_via1 <- c('1','0')
size_via2 <- c('1','2')
df1 <- data.frame(id,value,size_dest1,size_dest2,size_via1,size_via2)

有什么线索吗?

解决方法

一个选项是使用 pivot_longer 重新整形为“long”格式,重新编码“size”中的值,对“size”、“via”列进行乘法,将其整形回“wide”格式,然后加入原始数据

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。