0

Here is my df:

   Analyte    name         Limit_Type
   <chr>      <chr>        <chr>     
 1 " BOD(C)"  Limit1       " 50%ile" 
 2 " BOD(C)"  Limit1_Value "10"         
 3 " CBOD(C)" Limit1       " 90%ile" 
 4 " CBOD(C)" Limit1_Value "15"      
 5 " CBOD(C)" Limit2       " NA"     
 6 " CBOD(C)" Limit2_Value  NA 

I want to essentially "spread" or pivot_wider() the 'Limit_Type' column so that my df looks like this:

   Analyte    Limit_Type Limit
   <chr>      <chr>      <chr>
 1 " BOD(C)"  " 50%ile"  10    
 2 " CBOD(C)" " 90%ile"  15    
 3 " CBOD(C)" "NA"       NA    

is this possible with dplyr?

thanks.

tm95
  • 77
  • 5

1 Answers1

2

You can change the name column to Limit and Limit_Type based on the presence of 'Value'. Get the data in wide format using pivot_wider

library(dplyr)
library(tidyr)

df %>%
  mutate(name = ifelse(grepl('Value', name), 'Limit', 'Limit_Type')) %>%
  pivot_wider(names_from = name, values_from = Limit_Type, values_fn = list) %>%
  unnest(cols = c(Limit_Type, Limit))

#  Analyte    Limit_Type Limit
#  <chr>      <chr>      <chr>
#1 " BOD(C)"  " 50%ile"  10   
#2 " CBOD(C)" " 90%ile"  15   
#3 " CBOD(C)" " NA"      NA   

data

df <- structure(list(Analyte = c(" BOD(C)", " BOD(C)", " CBOD(C)", 
" CBOD(C)", " CBOD(C)", " CBOD(C)"), name = c("Limit1", "Limit1_Value", 
"Limit1", "Limit1_Value", "Limit2", "Limit2_Value"), Limit_Type = c(" 50%ile", 
"10", " 90%ile", "15", " NA", NA)), class = "data.frame", row.names = c(NA, -6L))
Ronak Shah
  • 377,200
  • 20
  • 156
  • 213