传播数据以创建唯一行

时间:2019-11-15 15:44:55

标签: r tidyr

我有一个数据框,我想对其进行重塑,以便对于每个中间对象,只有一行。我知道我可以使用传播来完成此任务,但是它并没有完全看我想要的样子,当我阅读博客,教程等时,我只是无法将想法笼罩在这个概念上,我不确定我要去哪里了

我的数据当前看起来像

   medid year dose drug
1    101 2001  500    A
2    101 2002  600    A
3    101 2003  750    A
4    101 2004  550    A
5    102 2001  300    B
6    102 2002  330    B
7    102 2003  350    B
8    102 2004  390    B
9    103 2001  100    C
10   103 2002   NA    C
11   103 2003  250    C
12   103 2004  125    C

但我希望它看起来像

  medid  dose.2001 dose.2002 dose.2003 dose.2004 drug.2001 drug.2002 drug.2003 drug.2004
1   101       500       600       750       550         A         A         A         A
2   102       300       330       350       390         B         B         B         B
3   103       100        NA       250       125         C         C         C         C

我尝试使用spread(),但是它没有给我每个GEOID唯一的行,而且它看起来也不像我想要的那样。

df <- data.frame(medid=c(101, 101, 101, 101, 102, 102, 102, 102, 103, 103, 103, 103),
                 year=c(2001, 2002, 2003, 2004, 2001, 2002, 2003, 2004, 2001, 2002, 2003, 2004),
                 dose=c(500, 600, 750, 550, 300, 330, 350, 390, 100, NA, 250, 125),
                 drug=c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C"))
df %>% spread(year, medid)

1 个答案:

答案 0 :(得分:2)

按照{Cettt的建议,使用tidyr::pivot_wider

library(tidyr)
pivot_wider(df, names_from=year, values_from=c(drug, dose), names_sep=".")
# # A tibble: 3 x 9
#   medid drug.2001 drug.2002 drug.2003 drug.2004 dose.2001 dose.2002 dose.2003 dose.2004
#   <dbl> <fct>     <fct>     <fct>     <fct>         <dbl>     <dbl>     <dbl>     <dbl>
# 1   101 A         A         A         A               500       600       750       550
# 2   102 B         B         B         B               300       330       350       390
# 3   103 C         C         C         C               100        NA       250       125