Использование распространения с повторяющимися идентификаторами дает разреженную матрицу с NA

Пользователь задал вопрос в github, https://github.com/tidyverse/tidyr/issues/41, и я вижу, что Хэдли определил это как ошибку. Однако решения не было. Я все еще испытываю эту проблему, когда у меня есть повторяющиеся идентификаторы в моем фрейме данных

structure(list(key = c("a", "b", "c", "d", "c"), value = c(1, 
2, 3, 2, 4)), .Names = c("key", "value"), row.names = c(NA, -5L
), class = c("tbl_df", "tbl", "data.frame"))

Теперь, когда я использую распространение из dplyr, у меня все еще остается разреженная матрица с NA, потому что у меня есть повторяющиеся идентификаторы, введите здесь код

dftest %>% spread(key,value)
Error: Duplicate identifiers for rows (3, 5)

Итак, я добавляю строку идентификатора

> dftest$id<-seq(1,5)
> dftest %>% spread(key,value)
# A tibble: 5 x 5
     id     a     b     c     d
  <int> <dbl> <dbl> <dbl> <dbl>
1     1    1.   NA    NA    NA 
2     2   NA     2.   NA    NA 
3     3   NA    NA     3.   NA 
4     4   NA    NA    NA     2.
5     5   NA    NA     4.   NA 

Но диагональный фрейм данных - это не то, что мне нужно. Я бы хотел, чтобы верхняя строка вывода спреда была 1,2,3,2 в строке 1. Тогда значение в столбце c попадет прямо под, в строке 2. То есть мне не нужно диагональная матрица с НА. Я что-то упускаю? - со смирением спрашиваю.


person Pancho Mulongeni    schedule 16.03.2018    source источник
comment
Вам нужно создать столбец последовательности, а затем spread   -  person akrun    schedule 16.03.2018


Ответы (1)


Вы так близки к тому, чтобы получить правильный результат.

Использование dftest из исходного ввода.

Метод:

dftest %>% group_by(key) %>% mutate(id = 1:length(key)) %>% spread(key, value)

Вывод:

# A tibble: 2 x 5
     id     a     b     c     d
  <int> <dbl> <dbl> <dbl> <dbl>
1     1    1.    2.    3.    2.
2     2   NA    NA     4.   NA
person Nik Muhammad Naim    schedule 16.03.2018
comment
@PanchoMulongeni Рад помочь. Пожалуйста, примите мой ответ, если он работает. - person Nik Muhammad Naim; 16.03.2018