обработка строк в матрице в R

#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)"