问题描述
从我的数据集中 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
分别以 dest
和 via
开头,(在我的原始数据集中,我有数百个以这些词开头的变量)。我手动尝试过(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