1
>dummy
   fooA fooB bar1 bar2
1     1    1    X    Y
2     2    2    X    Y
3     3    3    X    Y
4     4    4    X    Y
5     5    5    X    Y
6     6    6    X    Y
7     7    7    X    Y
8     8    8    X    Y
9     9    9    X    Y
10   10   10    X    Y

> dummy2
   foo bar1 bar2 AB
1    1    X    Y  A
2    2    X    Y  A
3    3    X    Y  A
4    4    X    Y  A
5    5    X    Y  A
6    6    X    Y  A
7    7    X    Y  A
8    8    X    Y  A
9    9    X    Y  A
10  10    X    Y  A
11   1    X    Y  B
12   2    X    Y  B
13   3    X    Y  B
14   4    X    Y  B
15   5    X    Y  B
16   6    X    Y  B
17   7    X    Y  B
18   8    X    Y  B
19   9    X    Y  B
20  10    X    Y  B

I wish to transform dummy into dummy2. What do you call this process? Stacking? Combining? And how can I do this in R? Is there any package recommendation?

aiorr
  • 547
  • 4
  • 11

1 Answers1

2

We can use pivot_longer

library(dplyr)
library(tidyr) 
dummy %>% 
  pivot_longer(cols = c(fooA, fooB), names_to = 'AB', 
      values_to = 'foo', names_prefix = 'foo') %>%
  arrange(AB) %>%
  select(foo, bar1, bar2, AB)

-output

# A tibble: 20 x 4
#     foo bar1  bar2  AB   
#   <int> <chr> <chr> <chr>
# 1     1 X     Y     A    
# 2     2 X     Y     A    
# 3     3 X     Y     A    
# 4     4 X     Y     A    
# 5     5 X     Y     A    
# 6     6 X     Y     A    
# 7     7 X     Y     A    
# 8     8 X     Y     A    
# 9     9 X     Y     A    
#10    10 X     Y     A    
#11     1 X     Y     B    
#12     2 X     Y     B    
#13     3 X     Y     B    
#14     4 X     Y     B    
#15     5 X     Y     B    
#16     6 X     Y     B    
#17     7 X     Y     B    
#18     8 X     Y     B    
#19     9 X     Y     B    
#20    10 X     Y     B    

data

dummy <- structure(list(fooA = 1:10, fooB = 1:10, bar1 = c("X", "X", "X", 
"X", "X", "X", "X", "X", "X", "X"), bar2 = c("Y", "Y", "Y", "Y", 
"Y", "Y", "Y", "Y", "Y", "Y")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
akrun
  • 874,273
  • 37
  • 540
  • 662