Я уверен, что есть более элегантное решение, но вы можете попробовать:
df %>%
gather(var, name_all, -matches("id|institution")) %>%
gather(var2, val, -c(id, institution, var, name_all)) %>%
mutate(id_all = ifelse(parse_number(var) == parse_number(var2), val, NA)) %>%
na.omit() %>%
select(-var, -var2, -val) %>%
arrange(id)
id institution name_all id_all
1 1 usp Miles_Davis 123
2 1 usp Arturo_Sandoval 111
3 2 unb Chet_Baker 321
4 2 unb Clifford_Brown 121
5 3 usp Wayne_Shorter 222
6 3 usp Hermeto_Pascoal 322
7 4 Puc-rio John_Coltrane 333
8 4 Puc-rio Charlie_Parker 112
Во-первых, оно преобразует данные из широких в длинные, исключая переменные, которые называются институция или идентификатор.Во-вторых, он выполняет второе преобразование ширины в длину, чтобы все пронумерованные переменные "id" и их значения были представлены в виде отдельных строк.В-третьих, он проверяет, имеет ли переменная «name» число в качестве переменной «id». Если это так, он присваивает соответствующее значение, в противном случае - NA. Наконец, он удаляет строки с NA, избыточными переменными и упорядочивает данные.
Пример данных:
df <- read.table(text = "
id institution name1 id1 name2 id2
1 usp Miles_Davis 123 Arturo_Sandoval 111
2 unb Chet_Baker 321 Clifford_Brown 121
3 usp Wayne_Shorter 222 Hermeto_Pascoal 322
4 Puc-rio John_Coltrane 333 Charlie_Parker 112", header = TRUE, stringsAsFactors = FALSE)