1

I am trying to take a dataframe I have with around 100 columns and 100000 rows and combine similarly named columns into one column e.g. C1,C2,C3 into C. I have been trying to use the dplyr gather function but I can't seem to get the desired output I am happy to use another package if that is easier. I have included a simplified example below. I'm sure I am missing something simple and any help would be really appreciated thanks.

id = c(222, 222, 222, 333, 333, 333, 444, 444, 444) 
timepoint = c("aa", "aa", "bb", "aa", "aa", "bb", "aa", "aa", "bb") 
position = c(1, 2, 1, 1, 2,1 , 1, 2, 1)
C1 = c("aat", "aaf", "bbg", "aag", "aag", "bbg", "aag", "aag", "bbg") 
P1 = c("A", "B", "C", "J", "J", "J", "J", "H", "H") 
X1 = c(21, 22, 23, 33, 35, 33, 41, 43, 45) 
C2 = c("aat", "aaf", "bbg", "aag", "aag", "bbg", "aag", "aag", "bbg") 
P2 = c("A", "B", "C", "J", "J", "J", "J", "H", "H") 
X2 = c(21, 22, 23, 33, 35, 33, 41, 43, 45) 
C3 = c("aat", "aaf", "bbg", "aag", "aag", "bbg", "aag", "aag", "bbg") 
P3 = c("A", "B", "C", "J", "J", "J", "J", "H", "H") 
X3 = c(21, 22, 23, 33, 35, 33, 41, 43, 45) 

df = data.frame(id, timepoint, position, C1, P1, X1, C2, P2, X2, C3, P3, X3)

I would like to go from this format

id  timepoint   position    C1  P1  X1  C2  P2  X2  C3  P3  X3
222 aa          1           aat A   21  aat A   21  aat A   21
222 aa          2           aaf B   22  aaf B   22  aaf B   22
222 bb          1           bbg C   23  bbg C   23  bbg C   23
333 aa          1           aag J   33  aag J   33  aag J   33
333 aa          2           aag J   35  aag J   35  aag J   35
333 bb          1           bbg J   33  bbg J   33  bbg J   33
444 aa          1           aag J   41  aag J   41  aag J   41
444 aa          2           aag H   43  aag H   43  aag H   43
444 bb          1           bbg H   45  bbg H   45  bbg H   45

to this format.

id  timepoint   position    C   P   X
222 aa          1           aat A   21
222 aa          2           aaf B   22
222 bb          1           bbg C   23
333 aa          1           aag J   33
333 aa          2           aag J   35
333 bb          1           bbg J   33
444 aa          1           aag J   41
444 aa          2           aag H   43
444 bb          1           bbg H   45
222 aa          1           aat A   21
222 aa          2           aaf B   22
222 bb          1           bbg C   23
333 aa          1           aag J   33
333 aa          2           aag J   35
333 bb          1           bbg J   33
444 aa          1           aag J   41
444 aa          2           aag H   43
444 bb          1           bbg H   45
222 aa          1           aat A   21
222 aa          2           aaf B   22
222 bb          1           bbg C   23
333 aa          1           aag J   33
333 aa          2           aag J   35
333 bb          1           bbg J   33
444 aa          1           aag J   41
444 aa          2           aag H   43
444 bb          1           bbg H   45
Dave Smith
  • 13
  • 2

1 Answers1

2

We can do this easily with melt from data.table which can take multiple measure patterns

library(data.table)
melt(setDT(df), measure = patterns("^C\\d+", "^P\\d+", "^X\\d+"), 
           value.name = c("C", "P", "X"))[, variable := NULL][]
#     id timepoint position   C P  X
# 1: 222        aa        1 aat A 21
# 2: 222        aa        2 aaf B 22
# 3: 222        bb        1 bbg C 23
# 4: 333        aa        1 aag J 33
# 5: 333        aa        2 aag J 35
# 6: 333        bb        1 bbg J 33
# 7: 444        aa        1 aag J 41
# 8: 444        aa        2 aag H 43
# 9: 444        bb        1 bbg H 45
#10: 222        aa        1 aat A 21
#11: 222        aa        2 aaf B 22
#12: 222        bb        1 bbg C 23
#13: 333        aa        1 aag J 33
#14: 333        aa        2 aag J 35
#15: 333        bb        1 bbg J 33
#16: 444        aa        1 aag J 41
#17: 444        aa        2 aag H 43
#18: 444        bb        1 bbg H 45
#19: 222        aa        1 aat A 21
#20: 222        aa        2 aaf B 22
#21: 222        bb        1 bbg C 23
#22: 333        aa        1 aag J 33
#23: 333        aa        2 aag J 35
#24: 333        bb        1 bbg J 33
#25: 444        aa        1 aag J 41
#26: 444        aa        2 aag H 43
#27: 444        bb        1 bbg H 45
akrun
  • 874,273
  • 37
  • 540
  • 662