#r #string #matrix #data-manipulation
#r #строка #матрица #манипулирование данными
Вопрос:
У меня есть матрица, подобная такой
A = matrix(
c("2 (1-3)", "4 (2-6)", "3 (2-4)", "1 (0.5-1.5)", "5 (2.5-7.5)", "7 (5-9)"),
nrow=3,
ncol=2)
Я хочу заменить все строки, где первый элемент меньше 5 (т. Е. «0», или «1», или «2», или «3», или «4») на «< 5». Это должно быть:
B = matrix(
c("< 5", "< 5", "< 5", "< 5", "5 (2.5-7.5)", "7 (5-9)"),
nrow=3,
ncol=2)
Есть идеи?
Ответ №1:
Извлеките 1-е число, преобразуйте его в числовое и замените числа, которые меньше 5, на "<5"
.
A[as.numeric(sub('(\d ).*', '\1', A)) < 5] <- '< 5'
A
# [,1] [,2]
#[1,] "< 5" "< 5"
#[2,] "< 5" "5 (2.5-7.5)"
#[3,] "< 5" "7 (5-9)"
Для извлечения первого числа и преобразования его в числовое используется ярлык readr::parse_number
.
A[readr::parse_number(A) < 5] <- '< 5'
Ответ №2:
Используйте substr() для извлечения 1-го символа каждого элемента матрицы. Пока это число, вы можете преобразовать его в единицу с помощью as.numeric()
A[as.numeric(substr(A,1,1))<5] <- "<5"
Ответ №3:
Нам не нужно извлекать и преобразовывать в числовое значение, если есть только 5 вариантов:
т.е. «0» или «1» или «2» или «3» или «4»
A[grep("^[0-4]", A)] <- "< 5"
Или
replace(A, grep("^[0-4]", A), "< 5")
Или
replace(A, startsWith("[0-4]", A), "< 5")
Результат
# [,1] [,2]
# [1,] "< 5" "< 5"
# [2,] "< 5" "5 (2.5-7.5)"
# [3,] "< 5" "7 (5-9)"
Ответ №4:
1) чтение.таблица
Используйте read.table
, чтобы получить первое число в каждой ячейке, дающее вектор firstNo
. Затем используйте replace
для замены этих ячеек на < 5
.
Исходный ввод A
сохраняется, что обычно желательно для упрощения тестирования и отладки, но если вы все равно предпочитаете перезаписать его, замените левую часть второй строки кода на A
.
Не используются регулярные выражения и пакеты.
firstNo <- read.table(text = A)[[1]]
B <- replace(A, firstNo < 5, "< 5")
B
предоставление:
[,1] [,2]
[1,] "< 5" "< 5"
[2,] "< 5" "5 (2.5-7.5)"
[3,] "< 5" "7 (5-9)"
Хотя это и не требуется для примера ввода в вопросе, если возможно, что текст после левой круглой скобки является неправильным, тогда вам может потребоваться добавить аргументы fill=TRUE
или comment.char = "("
в read.table
.
2) gsubfn
gsubfn
аналогично gsub
, за исключением того, что он вводит группы захвата в регулярном выражении, то есть заключенные в скобки части регулярного выражения, в функцию, выраженную в виде формулы во втором аргументе, а затем заменяет совпадение выводом функции.
library(gsubfn)
B <- replace(A,
TRUE,
gsubfn("^(\d) (.*)", ~ if (as.numeric(x) < 5) "< 5" else paste(x, y), A)
)
B
предоставление:
[,1] [,2]
[1,] "< 5" "< 5"
[2,] "< 5" "5 (2.5-7.5)"
[3,] "< 5" "7 (5-9)"