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
选项 nchar
和 gsub
nchar(gsub("[^BC]", "", temp$A))
#[1] 0 1 1 2
我正在处理如下所示的数据框,并想计算 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
选项 nchar
和 gsub
nchar(gsub("[^BC]", "", temp$A))
#[1] 0 1 1 2