Распределение пар ключ-значение в столбцы

Я застрял со следующей проблемой обработки данных. Каждый набор данных имеет несколько значений 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

Есть ли аккуратный способ генерировать желаемый результат?

PS: я знаю о вопросе " ключ-значение-пары-когда-ключи-в-разных-столбцах", но решение

dcast(melt(someDatasets, id = "aName", na.rm = TRUE), aName~value)

не производит желаемый результат, потому что агрегатная функция length используется.

1 ответ

Решение

Как указано в комментариях @lukeA и @A Handcart and Mohair, вы можете добавить дополнительный идентификатор к своим данным, чтобы избежать проблемы с дублирующимися ключами.

library(dplyr)
library(tidyr)

tidyData = bind_rows(someDatasets) %>% 
   group_by(dataset, aName) %>% 
   mutate(id = paste0(aName, 1:n())) %>% 
   ungroup() %>% 
   select(-aName)

# head(tidyData)
# Source: local data frame [6 x 3]
# 
#   aValue dataset    id
#    <dbl>   <chr> <chr>
# 1      1     ds1    a1
# 2      2     ds1    a2
# 3      3     ds1    a3
# 4      4     ds1    b1
# 5      5     ds1    b2
# 6     10     ds2    a1

id теперь уникален в каждой группе (наборе данных), поэтому мы можем приступить к распространению:

tidyData %>% 
   spread(dataset, aValue) %>% 
   mutate(id = substr(id, 1, 1))

# Source: local data frame [10 x 4]
# 
#      id   ds1   ds2   ds3
#   <chr> <dbl> <dbl> <dbl>
# 1     a     1    10   100
# 2     a     2    20    NA
# 3     a     3    30    NA
# 4     b     4    40    NA
# 5     b     5    NA    NA
# 6     c    NA    50   200
# 7     c    NA    60   300
# 8     c    NA    NA   400
Другие вопросы по тегам