1

I have this data frame:

id <- c(0,1,2,3,4)
groupA_sample1_values <- c(10,11,12,13,14)
groupA_sample2_values <- c(20,21,22,23,24)
groupA_sample3_values <- c(30,31,32,33,34)
groupB_sample1_values <- c(40,41,42,43,44)
groupB_sample2_values <- c(50,51,52,53,54)
groupB_sample3_values <- c(60,61,62,63,64)

df <- data.frame(id, 
                 groupA_sample1_values,
                 groupA_sample2_values,
                 groupA_sample3_values,
                 groupB_sample1_values,
                 groupB_sample2_values,
                 groupB_sample3_values)

df

and I am trying to obtain another table with these columns: id, group, sample, value. I belive I would have to extract the name groupA/groupB with regex, and the same for the sample number, and the melt it to a new data frame, but I'm not sure how to approach it. Any help?

Wiktor Stribiżew
  • 607,720
  • 39
  • 448
  • 563
CodingBiology
  • 262
  • 4
  • 13

1 Answers1

1

try

library( tidyverse )
df %>%
  pivot_longer( -id,
                names_to = c("group", "sample" ),
                names_pattern = "group(.)_sample(.)_values",
                values_to = "value" )

# # A tibble: 30 x 4
#      id group sample value
#   <dbl> <chr> <chr>  <dbl>
# 1     0 A     1         10
# 2     0 A     2         20
# 3     0 A     3         30
# 4     0 B     1         40
# 5     0 B     2         50
# 6     0 B     3         60
# 7     1 A     1         11
# 8     1 A     2         21
# 9     1 A     3         31
#10     1 B     1         41
Wimpel
  • 26,031
  • 1
  • 20
  • 37