There are a couple of issues with your first separate:
separate(data, value, into = c("Ratings","Weighted Avg","IBU","Est Calories","abv"),sep="[//s]",fill = "right")
s = "[//s]" Probably isn't doing what you intend it to. sep is a regular expression that is used to match the text between columns.
This "[//s]" and this "[/s]" equivalent regular expressions. It is what regular expressions call a character class and matches any 's' or '/' , i.e. match any letter s or forward slash.
It may be that you meant "[\s] but that would not have worked either. Also "[\s] and "\s" are equivalent regular expression and match a whitespace character.
Another issue is that sep matches specifically the text between columns... so the "RATINGS" at the beginning of each line would be considered to be coming after a zero width column because there is no value which preceeds it.
Another thing about separate is that is cannot figure out where columns belong or what column names are, it just separates thing as it finds in order. Fill just tells it what to do if it cannot find enough pieces of data for all the column names listed in col.
The following works but it probably isn't what you want but it may give you a better idea of how separate work.
BTW the sep value is as complicated as it is because the separator text has the format that it does.
suppressPackageStartupMessages(library("tidyverse"))
# make tribble
data <- tibble::tribble(
~value,
"RATINGS: 4 MEAN: 3.83/5.0 WEIGHTED AVG: 3.39/5 IBU: 35 EST. CALORIES: 204 ABV: 6.8%",
"RATINGS: 89 WEIGHTED AVG: 3.64/5 EST. CALORIES: 188 ABV: 6.25%",
"RATINGS: 8 MEAN: 3.7/5.0 WEIGHTED AVG: 3.45/5 IBU: 85 EST. CALORIES: 213 ABV: 7.1%"
)
# regular expression that matches the text between columns
sp <- "\\p{Letter}+\\s+\\p{Letter}+:\\s+|\\p{Letter}+\\.\\s+\\p{Letter}+:\\s+|\\p{Letter}+:\\s+"
# pipe to process data
sd <- data %>%
# separate strings in to columns
# the "skip" column catches the empty column that preceds "Ratings:"
separate(value,
into = c("skip", "Ratings", "Mean", "Weighted Avg","IBU","Est Calories","abv"),
sep = sp, fill = "right") %>%
# throw the skip column
select("Mean", "Weighted Avg", "IBU", "Est Calories", "abv")
# view the content of sd
sd
#> # A tibble: 3 x 5
#> Mean `Weighted Avg` IBU `Est Calories` abv
#> * <chr> <chr> <chr> <chr> <chr>
#> 1 3.83/5.0 3.39/5 35 204 6.8%
#> 2 3.64/5 188 6.25% <NA> <NA>
#> 3 3.7/5.0 3.45/5 85 213 7.1%
In the end it just has the values, in order, that it found in each line... because separate doesn't know what column a piece of data if finds belongs to, is just distinguishes separator text from values.