считать, если слово соответствует обоим столбцам одновременно - PullRequest
2 голосов
/ 06 мая 2020

Как подсчитать определенное c слово, присутствующее в обоих столбцах одновременно?

ab <- data.frame(one = c("abcd","efg","ijk"), two = c("abcd mmmk","abcd qrst","ijk"))

Мне нужно получить количество abcd, только если оно присутствует в обоих столбцах один и два.

например: Ожидаемый результат: количество abcd = 1,

bcos только первая строка имеет оба abcd, но вторая строка не может быть добавлена, так как только одна строка получила abcd, но код Я пробовал ниже дает результат как «2»

Пожалуйста, помогите мне достичь этого

Код:

length(grep('abcd',ab$one) & grep('abcd', ab$two))

Ответы [ 4 ]

5 голосов
/ 06 мая 2020

Вы можете использовать grepl с sapply и rowSums, чтобы подсчитать, соответствует ли слово всем столбцам :

sum(rowSums(sapply(ab, grepl, pattern="abcd")) == ncol(ab))
#sum(rowSums(!sapply(ab, grepl, pattern="abcd")) == 0) #Alternativ
#[1] 1
3 голосов
/ 06 мая 2020

Используйте grepl для проверки шаблона и sum для подсчета вхождений.

sum(grepl('abcd', ab$one) & grepl('abcd', ab$two))
#[1] 1
1 голос
/ 06 мая 2020

Вариант с str_count

library(stringr)
sum(str_count(do.call(paste, ab), 'abcd') == 2)
#[1] 1
1 голос
/ 06 мая 2020

Вы можете подсчитать количество строк в which шаблон abcd повторяется в столбцах:

nrow(ab[which(grepl("(abcd)\\s\\1", apply(ab, 1, paste0, collapse = " "))),])
[1] 1

EDIT:

Если шаблон уже повторяется в один столбец, тогда это будет работать, чтобы соответствовать только повторению по столбцам :

Данные:

ab <- data.frame(one = c("abcd","efg","ijk"), two = c("abcd mmmk","abcd abcd","ijk"))
ab
   one       two
1 abcd abcd mmmk
2  efg abcd abcd # this is the row we do not want to match as the dup is in a single col
3  ijk       ijk

Корректировка состоит в том, что шаблон больше не включает \\s и строки сворачиваются без пробела:

nrow(ab[which(grepl("(abcd)\\1", apply(ab, 1, paste0, collapse = ""))),])
[1] 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...