Попробуйте также использовать номенклатуру Tidyverse, там есть несколько очень мощных и простых в исполнении команд, и вы не падаете в ловушку проблем if_else, из-за которых вы легко можете потеряться;
ID <- c('C1', 'C2', 'O1', 'CG18', 'OG20')
dat <- data.frame(ID)
require(tidyverse)
# use 'case_when' from dplyr and 'stringr' commands
dat <- dat %>%
mutate(
treatment = case_when(
# regex anchors 'C' at beginning followed by digits
str_detect(ID, '^C\\d+') ~ 'conventional'
# regex anchors 'O' at beginning followed by digits
, str_detect(ID, '^O\\d+') ~ 'organic'
# regex to detect 'G'
, str_detect(ID, 'G') ~ 'grassland'
, TRUE ~ 'NA')
)
![should give you this](https://i.stack.imgur.com/1hHW5.jpg)