Мы могли бы использовать split
для разделения значений в столбце на основе имен столбцов.
Если у вас есть ограниченные столбцы, вы можете вручную создавать столбцы (как я) или делать это программно, используя paste
и seq
в соответствии со структурой ваших столбцов.
cols <- c("q1", "q3", "q5")
vals <- c("q2", "q4", "q6")
do.call("cbind.data.frame", split(unlist(df[vals]), unlist(df[cols])))
# c1 c2 c3
#q22 e1 e1 e0
#q41 e1 e2 e2
#q63 e1 e0 e2
Вы можете cbind
первый столбец, чтобы получить ID
столбец обратно.
cbind(df[1], do.call("cbind.data.frame", split(unlist(df[vals]), unlist(df[cols]))))
# ID c1 c2 c3
#q22 1 e1 e1 e0
#q41 2 e1 e2 e2
#q63 3 e1 e0 e2
Как упомянул @Farah Nazifa, если мы хотим поддерживать порядок строк также для каждого столбца, мы можем использовать mapply
следующим образом.
col_values <- unlist(df[cols])
data.frame(mapply(function(x, y) x[y],
split(unlist(df[vals]), col_values), split(row(df[vals]), col_values)))
# c1 c2 c3
#q41 e1 e1 e2
#q22 e1 e0 e2
#q63 e1 e2 e0