Wide to Long

Example of an wide data -

> wide <- data.frame(
+   ID = 1:6,
+   Gender = rep(c("F","M"),each = 3),
+   Control = round(runif(6,1,5)),
+   Exp1 = round(runif(6,1,5)),
+   Exp2 = round(runif(6,1,5))
+ )
> wide
  ID Gender Control Exp1 Exp2
1  1      F       3    4    4
2  2      F       4    2    3
3  3      F       2    2    1
4  4      M       5    3    3
5  5      M       3    4    2
6  6      M       5    3    3

Using gather

Using gather() function from tidyr package to transform it to long format -

> tidyr::gather(data = wide, 
+               key = Type, value = Value, 
+               Control, Exp1, Exp2,
+               factor_key = T # If TRUE, key values will be stored as a factor
+               )
   ID Gender    Type Value
1   1      F Control     3
2   2      F Control     4
3   3      F Control     2
4   4      M Control     5
5   5      M Control     3
6   6      M Control     5
7   1      F    Exp1     4
8   2      F    Exp1     2
9   3      F    Exp1     2
10  4      M    Exp1     3
11  5      M    Exp1     4
12  6      M    Exp1     3
13  1      F    Exp2     4
14  2      F    Exp2     3
15  3      F    Exp2     1
16  4      M    Exp2     3
17  5      M    Exp2     2
18  6      M    Exp2     3

Another way to do this -

> tidyr::gather(data = wide, 
+               key = Type, value = Value, 
+               -Gender, - ID,  # to use all columns except these
+               factor_key = T 
+               )
   ID Gender    Type Value
1   1      F Control     3
2   2      F Control     4
3   3      F Control     2
4   4      M Control     5
5   5      M Control     3
6   6      M Control     5
7   1      F    Exp1     4
8   2      F    Exp1     2
9   3      F    Exp1     2
10  4      M    Exp1     3
11  5      M    Exp1     4
12  6      M    Exp1     3
13  1      F    Exp2     4
14  2      F    Exp2     3
15  3      F    Exp2     1
16  4      M    Exp2     3
17  5      M    Exp2     2
18  6      M    Exp2     3

gather_() can be used to programmatically do the whole thing. The difference is the column names need to be supplied as strings in quotation instead of bare column names.

Using melt

> # To get help
> # ?melt.data.frame
> reshape2::melt(data = wide, 
+                id.vars = c("ID","Gender"),
+                measure.vars = c("Control","Exp1","Exp2"),
+                variable.name = "Group",
+                value.name = "Values")
   ID Gender   Group Values
1   1      F Control      3
2   2      F Control      4
3   3      F Control      2
4   4      M Control      5
5   5      M Control      3
6   6      M Control      5
7   1      F    Exp1      4
8   2      F    Exp1      2
9   3      F    Exp1      2
10  4      M    Exp1      3
11  5      M    Exp1      4
12  6      M    Exp1      3
13  1      F    Exp2      4
14  2      F    Exp2      3
15  3      F    Exp2      1
16  4      M    Exp2      3
17  5      M    Exp2      2
18  6      M    Exp2      3

Long to Wide

Example of a data in long format -

> long <- tidyr::gather(data = wide, 
+               key = Type, value = Value, 
+               -Gender, - ID, 
+               factor_key = T 
+               )
> long
   ID Gender    Type Value
1   1      F Control     3
2   2      F Control     4
3   3      F Control     2
4   4      M Control     5
5   5      M Control     3
6   6      M Control     5
7   1      F    Exp1     4
8   2      F    Exp1     2
9   3      F    Exp1     2
10  4      M    Exp1     3
11  5      M    Exp1     4
12  6      M    Exp1     3
13  1      F    Exp2     4
14  2      F    Exp2     3
15  3      F    Exp2     1
16  4      M    Exp2     3
17  5      M    Exp2     2
18  6      M    Exp2     3

Using spread

> tidyr::spread(data = long,
+               key = Type, value = Value)
  ID Gender Control Exp1 Exp2
1  1      F       3    4    4
2  2      F       4    2    3
3  3      F       2    2    1
4  4      M       5    3    3
5  5      M       3    4    2
6  6      M       5    3    3

Using dcast

> reshape2::dcast(data = long,
+                 formula = ID+Gender ~ Type,
+                 value.var = "Value")
  ID Gender Control Exp1 Exp2
1  1      F       3    4    4
2  2      F       4    2    3
3  3      F       2    2    1
4  4      M       5    3    3
5  5      M       3    4    2
6  6      M       5    3    3
LS0tDQp0aXRsZTogIlJlc2hhcGUgRGF0YTogV2lkZSB0byBMb25nIGFuZCBWaWNlLXZlcnNhIg0KYXV0aG9yOiAnTUQgQUhTQU5VTCBJU0xBTScNCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBjb21tZW50ID0gIiIsIHByb21wdCA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFDQopDQpgYGANCg0KLS0tDQoNCiMgV2lkZSB0byBMb25nDQoNCkV4YW1wbGUgb2YgYW4gd2lkZSBkYXRhIC0NCmBgYHtyfQ0Kd2lkZSA8LSBkYXRhLmZyYW1lKA0KICBJRCA9IDE6NiwNCiAgR2VuZGVyID0gcmVwKGMoIkYiLCJNIiksZWFjaCA9IDMpLA0KICBDb250cm9sID0gcm91bmQocnVuaWYoNiwxLDUpKSwNCiAgRXhwMSA9IHJvdW5kKHJ1bmlmKDYsMSw1KSksDQogIEV4cDIgPSByb3VuZChydW5pZig2LDEsNSkpDQopDQp3aWRlDQpgYGANCg0KIyMgVXNpbmcgZ2F0aGVyDQoNClVzaW5nIGBnYXRoZXIoKWAgZnVuY3Rpb24gZnJvbSB0aWR5ciBwYWNrYWdlIHRvIHRyYW5zZm9ybSBpdCB0byBsb25nIGZvcm1hdCAtDQpgYGB7cn0NCnRpZHlyOjpnYXRoZXIoZGF0YSA9IHdpZGUsIA0KICAgICAgICAgICAgICBrZXkgPSBUeXBlLCB2YWx1ZSA9IFZhbHVlLCANCiAgICAgICAgICAgICAgQ29udHJvbCwgRXhwMSwgRXhwMiwNCiAgICAgICAgICAgICAgZmFjdG9yX2tleSA9IFQgIyBJZiBUUlVFLCBrZXkgdmFsdWVzIHdpbGwgYmUgc3RvcmVkIGFzIGEgZmFjdG9yDQogICAgICAgICAgICAgICkNCmBgYA0KDQpBbm90aGVyIHdheSB0byBkbyB0aGlzIC0NCmBgYHtyfQ0KdGlkeXI6OmdhdGhlcihkYXRhID0gd2lkZSwgDQogICAgICAgICAgICAgIGtleSA9IFR5cGUsIHZhbHVlID0gVmFsdWUsIA0KICAgICAgICAgICAgICAtR2VuZGVyLCAtIElELCAgIyB0byB1c2UgYWxsIGNvbHVtbnMgZXhjZXB0IHRoZXNlDQogICAgICAgICAgICAgIGZhY3Rvcl9rZXkgPSBUIA0KICAgICAgICAgICAgICApDQpgYGANCg0KYGdhdGhlcl8oKWAgY2FuIGJlIHVzZWQgdG8gcHJvZ3JhbW1hdGljYWxseSBkbyB0aGUgd2hvbGUgdGhpbmcuIFRoZSBkaWZmZXJlbmNlIGlzIHRoZSBjb2x1bW4gbmFtZXMgbmVlZCB0byBiZSBzdXBwbGllZCBhcyBzdHJpbmdzIGluIHF1b3RhdGlvbiBpbnN0ZWFkIG9mIGJhcmUgY29sdW1uIG5hbWVzLg0KDQojIyBVc2luZyBtZWx0DQoNCmBgYHtyfQ0KIyBUbyBnZXQgaGVscA0KIyA/bWVsdC5kYXRhLmZyYW1lDQpyZXNoYXBlMjo6bWVsdChkYXRhID0gd2lkZSwgDQogICAgICAgICAgICAgICBpZC52YXJzID0gYygiSUQiLCJHZW5kZXIiKSwNCiAgICAgICAgICAgICAgIG1lYXN1cmUudmFycyA9IGMoIkNvbnRyb2wiLCJFeHAxIiwiRXhwMiIpLA0KICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJHcm91cCIsDQogICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIlZhbHVlcyIpDQpgYGANCg0KDQojIExvbmcgdG8gV2lkZQ0KDQpFeGFtcGxlIG9mIGEgZGF0YSBpbiBsb25nIGZvcm1hdCAtDQpgYGB7cn0NCmxvbmcgPC0gdGlkeXI6OmdhdGhlcihkYXRhID0gd2lkZSwgDQogICAgICAgICAgICAgIGtleSA9IFR5cGUsIHZhbHVlID0gVmFsdWUsIA0KICAgICAgICAgICAgICAtR2VuZGVyLCAtIElELCANCiAgICAgICAgICAgICAgZmFjdG9yX2tleSA9IFQgDQogICAgICAgICAgICAgICkNCmxvbmcNCmBgYA0KDQojIyBVc2luZyBzcHJlYWQNCg0KYGBge3J9DQp0aWR5cjo6c3ByZWFkKGRhdGEgPSBsb25nLA0KICAgICAgICAgICAgICBrZXkgPSBUeXBlLCB2YWx1ZSA9IFZhbHVlKQ0KYGBgDQoNCiMjIFVzaW5nIGRjYXN0DQoNCmBgYHtyfQ0KcmVzaGFwZTI6OmRjYXN0KGRhdGEgPSBsb25nLA0KICAgICAgICAgICAgICAgIGZvcm11bGEgPSBJRCtHZW5kZXIgfiBUeXBlLA0KICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9ICJWYWx1ZSIpDQpgYGANCg0K