2016-09-01 4 views
0

Учитывая эти данные:Spread (tidyr) - Распространение повторяющихся значений

x <- c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4) 
y <- c('Name', 'Street', 'Gender', 'Name', 'Street', 'Name', 'Street', 'Street', 'Dateofbirth', 'Gender','Name') 
z <- c('Jasper', 'Broadway', 'Male', 'Alice', 'Narrowstreet', 'Peter', 'Neverland', 'Treasureisland', '1841', 'Male','Martin') 

k <- data.frame(id = x, key = y, value = z) 

Я хотел бы создать чистую таблицу 4-столбца, который имеет ключи как заголовки (т.е. имя, улица, Пол и дату рождения). Проблема здесь в том, что ключ «Улица» для Питера двойной. Я пытался использовать распространение (tidyr), но мне не удалось заставить его работать.

k <- k %>% group_by(id) %>% 
      mutate(index = row_number()) %>% 
      spread(key, value) 

Я также дал выстрел:

k <- k %>% group_by(id) %>% 
    mutate(index = row_number()) %>% 
    spread(id, value) 

Результат не то, что я ожидал, и обе таблицы довольно трудно работать. Есть идеи?

+2

Непонятно, что вы хотите сделать с этими удвоенными значениями ... Один вариант (с использованием reshape2 вместо tidyr) выглядит как 'dcast (k, id ~ key, fun = toString)' – Frank

+1

Хорошая точка. В идеале я хотел бы сохранить их и вставить в отдельные столбцы. Как второй лучший вариант, я мог бы просто сохранить первый. Я изменю вопрос, если вы считаете, что это недостаточно ясно. – Jasper

+0

Да, я думаю, было бы хорошо отредактировать это. На мой взгляд, хорошо перечислять оба варианта. – Frank

ответ

2

Не знаю, если это именно то, что вы ищете, но если вы просто хотите сохранить первый, вы можете group_by(id,key) и summarisevalue с помощью first. Затем, перегруппировать по id и spread:

library(dplyr) 
library(tidyr) 
k <- k %>% group_by(id, key) %>% summarise(value=first(value)) %>% group_by(id) %>% spread(key,value)  
##Source: local data frame [4 x 5] 
##Groups: id [4] 
## 
##  id Dateofbirth Gender Name  Street 
##* <dbl>  <fctr> <fctr> <fctr>  <fctr> 
##1  1   NA Male Jasper  Broadway 
##2  2   NA  NA Alice Narrowstreet 
##3  3  1841 Male Peter Neverland 
##4  4   NA  NA Martin   NA 

Чтобы поместить удвоенные значения в отдельных колонках, используйте make.names для создания уникальных ключей:

k <- k %>% group_by(id) %>% mutate(key=make.names(key,unique=TRUE)) %>% group_by(id) %>% spread(key,value) 
##Source: local data frame [4 x 6] 
##Groups: id [4] 
## 
##  id Dateofbirth Gender Name  Street  Street.1 
##* <dbl>  <fctr> <fctr> <fctr>  <fctr>   <fctr> 
##1  1   NA Male Jasper  Broadway    NA 
##2  2   NA  NA Alice Narrowstreet    NA 
##3  3  1841 Male Peter Neverland Treasureisland 
##4  4   NA  NA Martin   NA    NA 

В качестве альтернативы, вы можете group_by(id,key) и summarisevalue с помощью toString или paste с collapse для выравнивания удвоенных значений:

k <- k %>% group_by(id, key) %>% summarise(value=toString(value)) %>% group_by(id) %>% spread(key,value) 
##Source: local data frame [4 x 5] 
##Groups: id [4] 
## 
##  id Dateofbirth Gender Name     Street 
##* <dbl>  <chr> <chr> <chr>      <chr> 
##1  1  <NA> Male Jasper     Broadway 
##2  2  <NA> <NA> Alice    Narrowstreet 
##3  3  1841 Male Peter Neverland, Treasureisland 
##4  4  <NA> <NA> Martin      <NA> 

 Смежные вопросы

  • Нет связанных вопросов^_^