对数据集的以下结构进行映像。
DF <- expand.grid(car=c("BMW","TESLA", "Mercedes"),
id=c("id1","id2","id3"),
id2=c("idA","idB"),
color_blue=c(0,1),
color_red=c(0,1),
color_black=c(0,1,2),
color_white=c(0,1),
tech_radio=c(0,1),
comf_heat=c(0,1),
stringsAsFactors=TRUE)
expand.grid为每种组合提供了一个数据集,这符合我的目的。诸如color_blue=1和color_red=1这样的组合是可能的,我想在它们出现时将其拆分。
我想从这里开始:
car id id2 color_blue color_red color_black color_white tech_radio comf_heat
BMW id1 idA 1 1 1 0 1 2
到那里
car id id2 color_blue color_red color_black color_white tech_radio comf_heat
BMW_blue id1 idA 1 0 0 0 1 2
BMW_red id1 idA 0 1 0 0 1 2
BMW_black id1 idA 0 0 1 0 1 2
实际上会发生两件事:
- 如果某些名称相似的变量(不是一个范围,因为这可能会改变(,则添加行作为重复项>0
- 重命名"的值;汽车-变量由保留的那个变量的某一部分决定
我知道可能有很多管道使用dplyr或tidyverse之类的解决方案。由于我没有使用这些,我对它们非常不熟悉,将它们应用于我的数据将更加困难。但最终:任何解决方案都将是进步。
这是有效的:
DF_test <- DF %>%
pivot_longer(cols = starts_with('color'), names_to='color') %>%
filter(value==1) %>%
mutate(color=gsub(color, pattern = 'color_', replacement = ''),
code_together=paste(car, color, sep = '_')) %>%
select(-c(color, car))