# Load required libraries
library(tidyr)
library(dplyr)
## 
## 载入程序包:'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Stage 1: Create the initial data frame
data <- data.frame(
  drug1 = c(rep("Briciclib", 9), rep("DrugX", 6), rep("DrugA", 3)),  # 9 = 3×3, 6 = 3×2, 3 = 3×1
  drug2 = c(rep("Bortezomib", 9), rep("DrugY", 6), rep("DrugB", 3)),
  conc1 = c(3, 2, 1, 3, 2, 1, 3, 2, 1,              # First pair: 3, 2, 1 (3 reps)
            3, 2, 1, 3, 2, 1,                        # Second pair: 3, 2, 1 (2 reps)
            3, 2, 1),                                # Third pair: 3, 2, 1 (1 rep)
  conc2 = c(3, 2, 1, 3, 2, 1, 3, 2, 1,              # First pair: 3, 2, 1 (3 reps)
            3, 2, 1, 3, 2, 1,                        # Second pair: 3, 2, 1 (2 reps)
            3, 2, 1),                                # Third pair: 3, 2, 1 (1 rep)
  response = c(33, 44, 55,                          # First pair (from original data)
               333, 444, 555,
               3333, 4444, 5555,
               88, 99, 110,                         # Second pair (example values)
               888, 999, 1110,
               77, 88, 99)                          # Third pair (example values)
)
print("Stage 1: Initial data frame")
## [1] "Stage 1: Initial data frame"
print(data)
##        drug1      drug2 conc1 conc2 response
## 1  Briciclib Bortezomib     3     3       33
## 2  Briciclib Bortezomib     2     2       44
## 3  Briciclib Bortezomib     1     1       55
## 4  Briciclib Bortezomib     3     3      333
## 5  Briciclib Bortezomib     2     2      444
## 6  Briciclib Bortezomib     1     1      555
## 7  Briciclib Bortezomib     3     3     3333
## 8  Briciclib Bortezomib     2     2     4444
## 9  Briciclib Bortezomib     1     1     5555
## 10     DrugX      DrugY     3     3       88
## 11     DrugX      DrugY     2     2       99
## 12     DrugX      DrugY     1     1      110
## 13     DrugX      DrugY     3     3      888
## 14     DrugX      DrugY     2     2      999
## 15     DrugX      DrugY     1     1     1110
## 16     DrugA      DrugB     3     3       77
## 17     DrugA      DrugB     2     2       88
## 18     DrugA      DrugB     1     1       99
# Stage 2: Add replicate identifier
data <- data %>%
  group_by(drug1, drug2, conc1, conc2) %>%
  mutate(replicate = row_number()) %>%
  ungroup()
print("Stage 2: Data with replicate identifier")
## [1] "Stage 2: Data with replicate identifier"
print(data)
## # A tibble: 18 x 6
##    drug1     drug2      conc1 conc2 response replicate
##    <chr>     <chr>      <dbl> <dbl>    <dbl>     <int>
##  1 Briciclib Bortezomib     3     3       33         1
##  2 Briciclib Bortezomib     2     2       44         1
##  3 Briciclib Bortezomib     1     1       55         1
##  4 Briciclib Bortezomib     3     3      333         2
##  5 Briciclib Bortezomib     2     2      444         2
##  6 Briciclib Bortezomib     1     1      555         2
##  7 Briciclib Bortezomib     3     3     3333         3
##  8 Briciclib Bortezomib     2     2     4444         3
##  9 Briciclib Bortezomib     1     1     5555         3
## 10 DrugX     DrugY          3     3       88         1
## 11 DrugX     DrugY          2     2       99         1
## 12 DrugX     DrugY          1     1      110         1
## 13 DrugX     DrugY          3     3      888         2
## 14 DrugX     DrugY          2     2      999         2
## 15 DrugX     DrugY          1     1     1110         2
## 16 DrugA     DrugB          3     3       77         1
## 17 DrugA     DrugB          2     2       88         1
## 18 DrugA     DrugB          1     1       99         1
# Stage 3: Pivot to wide format
data_wide <- data %>%
  pivot_wider(
    names_from = replicate,
    values_from = response,
    names_prefix = "response"
  )
print("Stage 3: Pivoted wide format")
## [1] "Stage 3: Pivoted wide format"
print(data_wide)
## # A tibble: 9 x 7
##   drug1     drug2      conc1 conc2 response1 response2 response3
##   <chr>     <chr>      <dbl> <dbl>     <dbl>     <dbl>     <dbl>
## 1 Briciclib Bortezomib     3     3        33       333      3333
## 2 Briciclib Bortezomib     2     2        44       444      4444
## 3 Briciclib Bortezomib     1     1        55       555      5555
## 4 DrugX     DrugY          3     3        88       888        NA
## 5 DrugX     DrugY          2     2        99       999        NA
## 6 DrugX     DrugY          1     1       110      1110        NA
## 7 DrugA     DrugB          3     3        77        NA        NA
## 8 DrugA     DrugB          2     2        88        NA        NA
## 9 DrugA     DrugB          1     1        99        NA        NA
# Stage 4: Adjust column order
data_wide <- data_wide %>%
  select(drug1, drug2, conc1, conc2, response1, response2, response3)
print("Stage 4: Final result with adjusted columns")
## [1] "Stage 4: Final result with adjusted columns"
print(data_wide)
## # A tibble: 9 x 7
##   drug1     drug2      conc1 conc2 response1 response2 response3
##   <chr>     <chr>      <dbl> <dbl>     <dbl>     <dbl>     <dbl>
## 1 Briciclib Bortezomib     3     3        33       333      3333
## 2 Briciclib Bortezomib     2     2        44       444      4444
## 3 Briciclib Bortezomib     1     1        55       555      5555
## 4 DrugX     DrugY          3     3        88       888        NA
## 5 DrugX     DrugY          2     2        99       999        NA
## 6 DrugX     DrugY          1     1       110      1110        NA
## 7 DrugA     DrugB          3     3        77        NA        NA
## 8 DrugA     DrugB          2     2        88        NA        NA
## 9 DrugA     DrugB          1     1        99        NA        NA
##########################################################################
# Load required libraries
library(tidyr)
library(dplyr)

# Starting point: Assume this is the data_wide from the previous step
data_wide <- data.frame(
  drug1 = c(rep("Briciclib", 3), rep("Paclitaxel", 3), rep("Doxorubicin", 3)),
  drug2 = c(rep("Bortezomib", 3), rep("Cisplatin", 3), rep("Gemcitabine", 3)),
  conc1 = c(3, 2, 1, 3, 2, 1, 3, 2, 1),
  conc2 = c(3, 2, 1, 3, 2, 1, 3, 2, 1),
  response1 = c(12.5, 18.3, 25.7, 15.8, 22.4, 29.6, 10.2, 14.5, 19.8),
  response2 = c(45.2, 58.9, 67.4, 48.7, 55.3, 62.1, NA, NA, NA),
  response3 = c(89.1, 95.6, 102.3, NA, NA, NA, NA, NA, NA)
)
print("Starting point: data_wide")
## [1] "Starting point: data_wide"
print(data_wide)
##         drug1       drug2 conc1 conc2 response1 response2 response3
## 1   Briciclib  Bortezomib     3     3      12.5      45.2      89.1
## 2   Briciclib  Bortezomib     2     2      18.3      58.9      95.6
## 3   Briciclib  Bortezomib     1     1      25.7      67.4     102.3
## 4  Paclitaxel   Cisplatin     3     3      15.8      48.7        NA
## 5  Paclitaxel   Cisplatin     2     2      22.4      55.3        NA
## 6  Paclitaxel   Cisplatin     1     1      29.6      62.1        NA
## 7 Doxorubicin Gemcitabine     3     3      10.2        NA        NA
## 8 Doxorubicin Gemcitabine     2     2      14.5        NA        NA
## 9 Doxorubicin Gemcitabine     1     1      19.8        NA        NA
# Stage 1: Pivot from wide to long format
data_long <- data_wide %>%
  pivot_longer(
    cols = starts_with("response"),         # Select all response columns
    names_to = "replicate",                 # Column name for replicate identifiers
    values_to = "response",                 # Column name for response values
    values_drop_na = TRUE                   # Drop rows where response is NA
  ) %>%
  mutate(replicate = as.integer(sub("response", "", replicate)))  # Convert "response1" to 1, etc.
print("Stage 1: Pivoted to long format")
## [1] "Stage 1: Pivoted to long format"
print(data_long)
## # A tibble: 18 x 6
##    drug1       drug2       conc1 conc2 replicate response
##    <chr>       <chr>       <dbl> <dbl>     <int>    <dbl>
##  1 Briciclib   Bortezomib      3     3         1     12.5
##  2 Briciclib   Bortezomib      3     3         2     45.2
##  3 Briciclib   Bortezomib      3     3         3     89.1
##  4 Briciclib   Bortezomib      2     2         1     18.3
##  5 Briciclib   Bortezomib      2     2         2     58.9
##  6 Briciclib   Bortezomib      2     2         3     95.6
##  7 Briciclib   Bortezomib      1     1         1     25.7
##  8 Briciclib   Bortezomib      1     1         2     67.4
##  9 Briciclib   Bortezomib      1     1         3    102. 
## 10 Paclitaxel  Cisplatin       3     3         1     15.8
## 11 Paclitaxel  Cisplatin       3     3         2     48.7
## 12 Paclitaxel  Cisplatin       2     2         1     22.4
## 13 Paclitaxel  Cisplatin       2     2         2     55.3
## 14 Paclitaxel  Cisplatin       1     1         1     29.6
## 15 Paclitaxel  Cisplatin       1     1         2     62.1
## 16 Doxorubicin Gemcitabine     3     3         1     10.2
## 17 Doxorubicin Gemcitabine     2     2         1     14.5
## 18 Doxorubicin Gemcitabine     1     1         1     19.8
# Stage 2: Remove replicate column to match original format (optional)
data_final <- data_long %>%
  select(drug1, drug2, conc1, conc2, response)
print("Stage 2: Final long format (matching original structure)")
## [1] "Stage 2: Final long format (matching original structure)"
print(data_final)
## # A tibble: 18 x 5
##    drug1       drug2       conc1 conc2 response
##    <chr>       <chr>       <dbl> <dbl>    <dbl>
##  1 Briciclib   Bortezomib      3     3     12.5
##  2 Briciclib   Bortezomib      3     3     45.2
##  3 Briciclib   Bortezomib      3     3     89.1
##  4 Briciclib   Bortezomib      2     2     18.3
##  5 Briciclib   Bortezomib      2     2     58.9
##  6 Briciclib   Bortezomib      2     2     95.6
##  7 Briciclib   Bortezomib      1     1     25.7
##  8 Briciclib   Bortezomib      1     1     67.4
##  9 Briciclib   Bortezomib      1     1    102. 
## 10 Paclitaxel  Cisplatin       3     3     15.8
## 11 Paclitaxel  Cisplatin       3     3     48.7
## 12 Paclitaxel  Cisplatin       2     2     22.4
## 13 Paclitaxel  Cisplatin       2     2     55.3
## 14 Paclitaxel  Cisplatin       1     1     29.6
## 15 Paclitaxel  Cisplatin       1     1     62.1
## 16 Doxorubicin Gemcitabine     3     3     10.2
## 17 Doxorubicin Gemcitabine     2     2     14.5
## 18 Doxorubicin Gemcitabine     1     1     19.8