mutate & rowwise & grepl 的替代品

Alternatives to mutate & rowwise & grepl

我正在处理如下所示的数据框,并想计算 A 列中某些模式('B' 和 'C')的出现次数。

使用 rowwise、mutate 和 grepl 的代码确实有效,但使用 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

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

您可以使用 stringr 中的 str_count(),因为它是在字符串和模式上矢量化的:

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

   A Count
1  A     0
2  B     1
3  C     1
4 BC     2

base R 选项 nchargsub

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