Добавить новые / повторяющиеся строки, зависящие от определенных значений столбцов

#r

#r

Вопрос:

Представьте следующую структуру набора данных.

 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 предоставляет набор данных с каждой комбинацией, что служит моей цели здесь. Возможны такие комбинации, как colour_blue= 1 и colour_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
 

По сути, должны произойти две вещи:

  1. добавление строк в качестве дубликатов, если некоторые переменные с одинаковыми именами (не диапазон, поскольку это может измениться)> 0
  2. переименуйте значение переменной «car» на определенную часть той переменной, которая сохраняется.

Я знаю, что, возможно, существует множество решений, использующих каналы, с dplyr или tidyverse или около того. Поскольку я их не использую, я с ними не знаком, и мне будет (сложнее) применить их к моим данным. Но в конце концов: любое решение будет прогрессом.

Комментарии:

1. никто? о боже..

Ответ №1:

Это работает:

 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))