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