Решение, предоставляемое @Sotos, намного более элегантно, но вы также можете сделать что-то подобное с tidyverse
:
df[-1, ] %>%
rename_at(1:3, funs(paste0(as.character(df[1,])))) %>%
rowid_to_column() %>%
gather(var, val, -rowid) %>%
mutate(val = ifelse(val == var, 1, 0)) %>%
spread(var, val) %>%
select(-rowid)
Car Cat Hat
1 0 1 0
2 0 0 1
3 1 0 0
Или:
df %>%
setNames(as.character(df[1,])) %>%
rowid_to_column() %>%
gather(var, val, -rowid) %>%
mutate(val = ifelse(val == var, 1, 0)) %>%
spread(var, val) %>%
filter(rowid != 1) %>%
select(-rowid)
Car Cat Hat
1 0 1 0
2 0 0 1
3 1 0 0
Сначала он устанавливает имена столбцов со значениями из первой строки. Во-вторых, он преобразует данные из широких в длинные. Наконец, он сравнивает, совпадает ли значение с именем столбца, и затем применяет данное условие.