Я думаю, что опции, основанные на регулярном выражении, также могут быть полезны для этих типов проблем
reve=c("M 3.2","B 3.6","B 2.8","B 3.5","M 4")
data=data.frame(reve, stringsAsFactors = F) # handle your data as strings, not factors
# regex to extract M vals and B vals
mvals <- stringi::stri_extract_all_regex(data, "M+\\s[0-9]\\.[0-9]|M+\\s[0-9]")[[1]]
bvals <- stringi::stri_extract_all_regex(data, "B+\\s[0-9]\\.[0-9]|B+\\s[0-9]")[[1]]
# gluing things together into a single df
len <- max(length(mvals), length(bvals)) # find the length
data.frame(M = c(mvals, rep(NA, len - length(mvals))) # ensure vectors are the same size
,B = c(bvals, rep(NA, len - length(bvals)))) # ensure vectors are the same size
В случае, если регулярное выражение незнакомо, первое выражение ищет «M», затем пробел, затем цифры 0до 9, затем точка, затем снова цифры от 0 до 9.Вертикальный канал находится в операторе «или», поэтому выражение также ищет «M», затем пробел, а затем цифры от 0 до 9. Вторая половина выражения учитывает случаи, подобные «M 4».Второе выражение делает то же самое, только для строк, которые содержат «B» вместо «M».
Это быстрые и грязные выражения регулярных выражений.Я уверен, что более чистые составы позволяют получить те же результаты.