r - 将变量交互作为例行程序创建
问题描述
从我的数据集中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
与变量开头dest
并via
分开,(在我的原始数据集中,我有数百个以这些词开头的变量)。我手动尝试了它(大小 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)
有什么线索吗?
解决方案
一个选项是用 重新整形为“长”格式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
推荐阅读
- testing - Spectron 可以用于非电子网络应用程序吗?
- python - 硒中的find_elements是否可以设置一定的深度?
- python - Python,将许多具有相似格式的文本文件导入带有格式的excel电子表格
- javascript - Redux/toolkit 在注销时重置所有状态,除了一个
- ruby-on-rails - 在所有请求之前运行的 RSwag RSpec 测试中执行数据库设置部分
- python - 递归/递归跟踪
- swift - 如何从其他视图更改 @State 变量
- python - CNN 只分类一个变量是真还是假
- anaconda - 文本宽度不会针对控制台宽度进行调整,并且代码在 Spyder4 中不再可见
- google-chrome-extension - 添加后未应用可选权限