Альтернативы mutate & rowwise & grepl

Я работаю над фреймом данных, как показано ниже, и хочу подсчитать появление некоторых шаблонов ('B' и 'C') из столбца A.

Код, который использует rowwise, mutate и grepl, работает, но использование rowwise выполняется довольно медленно. Мне интересно, есть ли какие-либо альтернативы rowwise для получения того же результата?

temp <- data.frame(
  A = c('A','B','C','BC')
)

temp %>% 
  dplyr::rowwise() %>%
  mutate( B = sum(grepl(pattern = 'B',A),grepl(pattern = 'C',A) ) )

Полученные результаты:

# A tibble: 4 x 2
# Rowwise: 
  A     Count
  <chr> <int>
1 A         0
2 B         1
3 C         1
4 BC        2

person Daves    schedule 19.11.2020    source источник


Ответы (3)


grepl векторизован, это ваша sum проблема. Вместо этого используйте +:

temp %>% 
  mutate( 
    Count = grepl(pattern = 'B', A) + grepl(pattern = 'C', A)
  )
#    A Count
# 1  A     0
# 2  B     1
# 3  C     1
# 4 BC     2

Такая же разница, как и эта:

sum(1:3,  1:3)
# [1] 12

1:3 + 1:3
# [1] 2 4 6
person Gregor Thomas    schedule 19.11.2020
comment
Спасибо, Грегор, за указание на основную проблему! - person Daves; 19.11.2020

Вы можете использовать str_count() из stringr, поскольку он векторизуется по строке и шаблону:

temp %>%
 mutate(Count = str_count(A, "B|C"))

   A Count
1  A     0
2  B     1
3  C     1
4 BC     2
person tmfmnk    schedule 19.11.2020
comment
Спасибо tmfmnk! Я думаю, ваше решение будет более чистым! - person Daves; 19.11.2020

Вариант base R с nchar и gsub

nchar(gsub("[^BC]", "", temp$A))
#[1] 0 1 1 2
person akrun    schedule 19.11.2020