Reshape a data frame from long to wide

百般思念 提交于 2019-12-22 08:20:43

问题


I have some issues to change the shape of my df.

Data:

id <- c(1,2,3,4,1,4,1,2,3)
a <- c("A","B","C","D","A","D","A","B","C")
b <- c(1,1,1,1,2,2,3,3,3)
c <- c(12,10,12,23,16,17,7,9,7)
df <- data.frame(id,a,b,c)

which results in:

id  a  b   c
 1  A  1  12
 2  B  1  10
 3  C  1  12
 4  D  1  23
 1  A  2  16
 4  D  2  17
 1  A  3   7
 2  B  3   9
 3  C  3   7

I would like to get the following structure where column b corresponds to month:

id    a     1    2    3  
 1    A    12   16    7
 2    B    10   NA    9
 3    C    12   NA    7
 4    D    23   17   NA

I tried:

df2 <- reshape(df, timevar = "b", idvar = c("id", "a", "c"), direction = "wide")

But that doesn't help much...


回答1:


Try this

library(reshape2)
dcast(df, id + a ~ b, value.var = "c")
#   id a  1  2  3
# 1  1 A 12 16  7
# 2  2 B 10 NA  9
# 3  3 C 12 NA  7
# 4  4 D 23 17 NA

Or slightly modifying your solution using reshape

reshape(df, timevar = "b", idvar = c("id", "a"), direction = "wide")
#   id a  1  2  3
# 1  1 A 12 16  7
# 2  2 B 10 NA  9
# 3  3 C 12 NA  7
# 4  4 D 23 17 NA



回答2:


Using tidyr

library(tidyr)
spread(df, b, c)

#  id a  1  2  3
#1  1 A 12 16  7
#2  2 B 10 NA  9
#3  3 C 12 NA  7
#4  4 D 23 17 NA


来源:https://stackoverflow.com/questions/31134062/reshape-a-data-frame-from-long-to-wide

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!