Reshape a data frame from long to wide

2019-05-09 13:49发布

问题:

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


标签: r reshape