Я не уверен на 100%, что понимаю, как выкладываются данные, но, думаю, у меня есть. Из данных примера видно, что участник 1 имеет несколько строк данных для totalDamageDealt из необработанных данных и что результат не требует агрегирования. Если это не так, могут потребоваться другие шаги. Я должен был сделать свои собственные данные образца, чтобы попытаться выполнить это. Если вы хотите опубликовать минимальный набор данных, который охватывает все возможности, это будет полезно.
В противном случае, вот несколько способов сделать данные полностью длинными, чтобы извлечь информацию об участнике, а затем снова расширить их, чтобы преобразовать их в нужный вам формат. Если вам требуется какое-либо агрегирование при расширении данных, это может произойти на шаге dcast
.
library(data.table)
library(stringr)
# Create example data
dt <- data.table(participant.1.stats.visionScore = c(1,1.1,1.2,1.3,1.4,1.5),
participant.1.stats.totalDamageDealt = c(7.1,8.1,9.1,10.1,11.1,12.1),
participant.2.stats.visionScore = c(2,2.1,2.2,2.3,2.4,2.5),
participant.2.stats.totalDamageDealt = c(7.2,8.2,9.2,10.2,11.2,12.2))
# Make data totally long (not wide at all)
dt <- melt(dt,measure.vars = names(dt))
# Separate participant and stat details into columns
dt[,participant := variable %>% str_extract("(?<=^participant\\.)\\d+")]
dt[,stat := variable %>% str_extract("(?<=.stats.).+")]
# Remove variable for cleanup
dt[,variable := NULL]
# Create an index to create a unique key in order to be able to dcast without aggregating
dt[,index := 1:.N, by = list(participant,stat)]
# dcast to make the data wide again
dt <- dcast(dt,index + participant ~ stat, value.var = "value")
# Sort to make it easier for a human to view the table
dt <- dt[order(participant)]
# index participant totalDamageDealt visionScore
# 1: 1 1 7.1 1.0
# 2: 2 1 8.1 1.1
# 3: 3 1 9.1 1.2
# 4: 4 1 10.1 1.3
# 5: 5 1 11.1 1.4
# 6: 6 1 12.1 1.5
# 7: 1 2 7.2 2.0
# 8: 2 2 8.2 2.1
# 9: 3 2 9.2 2.2
# 10: 4 2 10.2 2.3
# 11: 5 2 11.2 2.4
# 12: 6 2 12.2 2.5