0

How can I turn partial columns to row and maintain the rest of the columns?

I have a sample table like below :

Name      Date      Math   Science    Computer
Zed      201401      89      90          93
Ben      201401      98      92          89
Dan      201401      83      96          92

Desired output:

Name      Date      Subject      Grade
Zed      201401      Math          89
Zed      201401      Science       90
Zed      201401      Computer      93
Ben      201401      Math          98
Ben      201401      Science       92
Ben      201401      Computer      89
Dan      201401      Math          83
Dan      201401      Science       96
Dan      201401      Computer      92

I tried using t(dataFrame) but it will transpose the whole data set.

Can anyone help? Thank you.

Jilber Urbina
  • 58,147
  • 10
  • 114
  • 138
Ianthe
  • 5,559
  • 21
  • 57
  • 74

2 Answers2

1

Use melt function from reshape2 package

> library(reshape2)
> melt(df, id=c("Name", "Date"), variable.name="Subject", value.name="Grade")
  Name   Date  Subject Grade
1  Zed 201401     Math    89
2  Ben 201401     Math    98
3  Dan 201401     Math    83
4  Zed 201401  Science    90
5  Ben 201401  Science    92
6  Dan 201401  Science    96
7  Zed 201401 Computer    93
8  Ben 201401 Computer    89
9  Dan 201401 Computer    92
Jilber Urbina
  • 58,147
  • 10
  • 114
  • 138
1

In base R, try the following:

cbind(mydf[c(1, 2)], stack(mydf[-c(1, 2)]))
#   Name   Date values      ind
# 1  Zed 201401     89     Math
# 2  Ben 201401     98     Math
# 3  Dan 201401     83     Math
# 4  Zed 201401     90  Science
# 5  Ben 201401     92  Science
# 6  Dan 201401     96  Science
# 7  Zed 201401     93 Computer
# 8  Ben 201401     89 Computer
# 9  Dan 201401     92 Computer
A5C1D2H2I1M1N2O1R2T1
  • 190,393
  • 28
  • 405
  • 485