Выбор конкретных символов из строки матрицы - PullRequest
1 голос
/ 08 февраля 2020

Предположим, у меня есть матрица с 4 строками и 1 столбцом: -

M[1,]<- s1 s2 s3 
M[2,]<- s2 s9 s1 s5 s6 s8 s3
M[3,]<- s4 s1 s7 s2 
M[4,]<- s2 s1 s3

Теперь я хочу узнать, сколько строк содержат все элементы из набора {s1,s2,s3}. Строки могут иметь и другие элементы, но они должны содержать все s1, s2 и s3 независимо от порядка. Очевидно, ответ должен быть 3, так как первый, второй и четвертый ряд удовлетворяют этому условию. Я знаю, что должен написать код примерно так: -

j=0
for(i in 1:4)
{
if(M[i,] satisfies **condition**)
j=j+1
}
return(j)

Я не получаю то, что я должен написать вместо условия. Я пытался поставить if(M[i,]== "s1 s2 s3"). Но это дает ответ 1. Может ли кто-нибудь мне помочь?

1 Ответ

2 голосов
/ 08 февраля 2020

Мы можем использовать strsplit, чтобы разделить vector на list и использовать %in% с all, чтобы проверить, все ли элементы 's1', 's2', 's3' найдены в list элемент и получить sum

sum(sapply(strsplit(M[,1], "\\s+"), function(x) all(c("s1", "s2", "s3") %in% x)))
#[1] 3

Другой вариант - извлечь значения из строки, отметьте lengths равным 3 (при условии, что значения не дублируются в пределах строка)

library(stringr)
sum(lengths(str_extract_all(M,  "s1|s2|s3")) == 3)
#[1] 3

данные

M <- structure(c("s1 s2 s3 ", "s2 s9 s1 s5 s6 s8 s3", "s4 s1 s7 s2", 
  "s2 s1 s3"), .Dim = c(4L, 1L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...