Преобразование нескольких фиктивных переменных, которые не являются взаимоисключающими, в одну категориальную переменную, добавление новых строк - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть следующий фрейм данных:

data <- data.frame(id=c(1, 1, 2, 2), 
task=c(1, 2, 1, 2),
strategy1=c("1", "1", "0", "1"),
strategy2=c("0", "0", "1", "1"),
strategy3=c("0", "1", "0", "1"))

Моя цель - объединить фиктивные переменные для разных стратегий в одну категориальную переменную, «стратегия». Если участник использовал несколько стратегий во время задачи, должны быть созданы новые строки с одинаковыми номерами «id» и «task», так как должна быть только одна переменная «стратегии».

Для данного примера фрейм данных должен наконец выглядеть следующим образом:

data_single <- data.frame(id=c(1, 1, 1, 2, 2, 2, 2),
task=c(1, 2, 2, 1, 2, 2, 2),
strategy=c("1", "1", "3", "2", "1", "2", "3"))

Может кто-нибудь показать мне, как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 27 апреля 2020
library(tidyr)
library(dplyr)
tidyr::pivot_longer(
  data, 
  cols = starts_with("strategy"),
  names_prefix = "strategy", 
  names_to = "strategy"
) %>%
  filter(value == 1) %>%
  select(-value)
# # A tibble: 7 x 3
#      id  task strategy
#   <dbl> <dbl> <chr>   
# 1     1     1 1       
# 2     1     2 1       
# 3     1     2 3       
# 4     2     1 2       
# 5     2     2 1       
# 6     2     2 2       
# 7     2     2 3  
0 голосов
/ 27 апреля 2020

Мы также можем использовать data.table

library(data.table)
melt(setDT(data), measure = patterns('^strategy'), 
     variable.name = 'strategy')[value == 1, .(id, task, strategy)]
...