Spread(tidyr) - 传播重复的值

时间:2016-09-01 14:54:29

标签: r dplyr tidyr

鉴于此数据:

_GetAll()

我想创建一个干净的4列表,其中包含密钥作为标题(即名称,街道,性别和出生日期)。这里的问题是彼得的关键“街道”是双倍的。我曾尝试使用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)

我也试了一下:

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

结果不是我所期望的,两个表都很难处理。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

不知道这是否正是您所寻找的,但如果您只想保留第一个,则group_by(id,key)summarise value可以使用{{1} }。然后,按firstid重新分组:

spread

要将doubled值放在不同的列中,请使用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) summarise使用valuetoString paste来平展加倍的值:

collapse