交互数百个变量
Interact hundreds of variables
来自我的数据集原始变量大小是数字(可以转换为数字,其中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')
original <- data.frame(id, size, dest1, dest2, via1, via2, value)
我想以系统的方式进行交互,变量 size 与分别以 dest
和 via
开头的变量,(在我的原始数据集中我有数百个以这些词开头的变量。
我已经手动尝试过 (SIZExDUMMY),但是对于所有可能的交互来说,这样做需要花费很多时间。
所以最终新数据库必须看起来像交互。你对这个结果有什么建议?
size_dest1 <- c('1', '0', '1', '0', '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')
interacted <- data.frame(id, size, dest1, dest2, via1, via2, value, size_dest1, size_dest2, size_via1, size_via2)
这样第一次交互就是size x dest1 = c(1,3,1,1,2) x c( 1,0,1,0,1) = c(1,0,1,0,2) = size_dest1。同样的想法适用于 size_dest2, ...., size_dest1, size_dest2, ....
有线索吗?
谢谢
- 将
size
列转换为 factor
并指定 levels
。
- 创建一个包含要与
Size
相乘的列名称的向量。
- 将因子转换为整数并将其与所有列相乘以创建新列。
original <- type.convert(original)
original$size <- factor(original$size, c('small', 'medium', 'large'))
cols <- grep('dest|via', names(original), value = TRUE)
original[paste0('size_', cols)] <- as.integer(original$size) * original[cols]
original
# id size dest1 dest2 via1 via2 value size_dest1 size_dest2 size_via1 size_via2
#1 1 small 1 0 1 1 4 1 0 1 1
#2 2 large 0 1 1 0 561 0 3 3 0
#3 3 small 1 1 0 1 310 1 1 0 1
#4 4 small 0 0 0 0 106 0 0 0 0
#5 5 medium 1 1 0 1 8 2 2 0 2
要将原始 类 复制回来,我们可以创建原始数据的副本,应用上述转换并将 类 改回原样。
copy <- original
#Trnaformation code from above
#...
#...
#Change the classes
original[names(copy)] <- Map(function(x, y) {class(x) <- class(y);x},
original[names(copy)], copy)
来自我的数据集原始变量大小是数字(可以转换为数字,其中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')
original <- data.frame(id, size, dest1, dest2, via1, via2, value)
我想以系统的方式进行交互,变量 size 与分别以 dest
和 via
开头的变量,(在我的原始数据集中我有数百个以这些词开头的变量。
我已经手动尝试过 (SIZExDUMMY),但是对于所有可能的交互来说,这样做需要花费很多时间。
所以最终新数据库必须看起来像交互。你对这个结果有什么建议?
size_dest1 <- c('1', '0', '1', '0', '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')
interacted <- data.frame(id, size, dest1, dest2, via1, via2, value, size_dest1, size_dest2, size_via1, size_via2)
这样第一次交互就是size x dest1 = c(1,3,1,1,2) x c( 1,0,1,0,1) = c(1,0,1,0,2) = size_dest1。同样的想法适用于 size_dest2, ...., size_dest1, size_dest2, ....
有线索吗?
谢谢
- 将
size
列转换为factor
并指定levels
。 - 创建一个包含要与
Size
相乘的列名称的向量。 - 将因子转换为整数并将其与所有列相乘以创建新列。
original <- type.convert(original)
original$size <- factor(original$size, c('small', 'medium', 'large'))
cols <- grep('dest|via', names(original), value = TRUE)
original[paste0('size_', cols)] <- as.integer(original$size) * original[cols]
original
# id size dest1 dest2 via1 via2 value size_dest1 size_dest2 size_via1 size_via2
#1 1 small 1 0 1 1 4 1 0 1 1
#2 2 large 0 1 1 0 561 0 3 3 0
#3 3 small 1 1 0 1 310 1 1 0 1
#4 4 small 0 0 0 0 106 0 0 0 0
#5 5 medium 1 1 0 1 8 2 2 0 2
要将原始 类 复制回来,我们可以创建原始数据的副本,应用上述转换并将 类 改回原样。
copy <- original
#Trnaformation code from above
#...
#...
#Change the classes
original[names(copy)] <- Map(function(x, y) {class(x) <- class(y);x},
original[names(copy)], copy)