Я застрял в задаче о проблемах с данными. Каждый набор данных имеет несколько значений aValue
за одно значение aName
. Это можно легко представить в аккуратном кадре данных.Распределение ключей значений в столбцах
someDatasets <- list(dataset1 = data.frame(aName = c("a", "a", "a", "b", "b"), aValue = 1:5, dataset = "ds1"),
dataset2 = data.frame(aName = c("a", "a", "a", "b", "c", "c"), aValue = (1:6)*10 , dataset = "ds2"),
dataset3 = data.frame(aName = c("a", "c", "c", "c"), aValue = (1:4)*100, dataset = "ds3"))
tidyData <- Reduce(dplyr::bind_rows, someDatasets)
Я хотел бы «разложить» переменную набора данных в отдельные столбцы. (Я не был в состоянии использовать tidyr::spread
для создания желаемого выхода из-за дублирование ключей.)
###
# Desired output
###
# aName ds1 ds2 ds3
# a 1 10 100
# a 2 20 NA
# a 3 30 NA
# b 4 40 NA
# b 5 NA NA
# c NA 50 200
# c NA 60 300
# c NA NA 400
Есть аккуратный способ получения желаемых результатов?
пс: Я знаю spread-key-value-pairs-when-keys-are-in-different-columns вопрос, но решение
dcast(melt(someDatasets, id = "aName", na.rm = TRUE), aName~value)
не производит желаемый результат, потому что агрегатная функция length
используется.
Где используется длина и почему это не желательно? –
Может быть, 'bind_rows (someDatasets)%>% group_by (dataset)%>% mutate (aName = paste0 (aName, 1: n()))%>% spread (набор данных, aValue)%>% mutate (aName = substr (aName, 1, 1)). – lukeA
Добавьте вторичный идентификатор на основе группировки «aName» и «набора данных» (из вашего набора данных «tidyData»), а затем используйте 'dcast'. Например, если вы назвали вторичный идентификатор «ID», вы можете сделать «dcast (tidyDataWithID, aName + ID ~ dataset, value.var =« aValue »)». – A5C1D2H2I1M1N2O1R2T1