R 需要对字符串上的函数进行矢量化

R 需要对字符串上的函数进行矢量化,r,R,我有一个300K行数据帧,其列如下: db$performance[1:10] [1] "1C1CCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCC" "4321CCCCCCCCCCCCCCCCCCCCC" "321CCCCCCCCCCCCCCCCCCCCCC" [5] "CCCCCCCCCCCCCC" "4321CCCCCCCCCCCCC0" "211CCCCCCCCCCCCCCCCCCCCC

我有一个300K行数据帧,其列如下:

   db$performance[1:10]
   [1] "1C1CCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCC"             
    "4321CCCCCCCCCCCCCCCCCCCCC" "321CCCCCCCCCCCCCCCCCCCCCC"
    [5] "CCCCCCCCCCCCCC"            "4321CCCCCCCCCCCCC0"  "211CCCCCCCCCCCCCCCCCCCCCC" "BCCCCCCCCC"     [9] "BCCCCCCCCC"                "8"       
我想搜索该列的每一行,并计算最后(从右到左)18个字符元素中出现的“4”的数量。我的循环解决方案显然很糟糕,因为它非常慢(6分钟或更长)。见下文。如何对解决方案进行矢量化(使用apply和/或dplyr?)

谢谢大家!

substrRight <- function(x, n){
 substr(x, nchar(x)-n, nchar(x))
}

db$NewVar = NA

for (N in 1:nrow(db)){
db$NewVar[N] = str_count( substrRight(db$performance[N],18), "4")
}

substrRight
stru count
substr
已经矢量化。因此,直接将函数应用于整个列

library(stringr)
str_count(substrRight(db$performance, 18), "4") 
#[1] 0 0 0 0 0 1 0 0 0 0
它应该足够快。在更大的数据集上检查计时

基准
db1
stru count
substr
已经矢量化。因此,直接将函数应用于整个列

library(stringr)
str_count(substrRight(db$performance, 18), "4") 
#[1] 0 0 0 0 0 1 0 0 0 0
它应该足够快。在更大的数据集上检查计时

基准
db1您只需执行
stru计数(db$performance(v1,18),“4”)
您只需执行
stru计数(db$performance(v1,18),“4”)
就行了。thx u。这是我刚才写的一个解决方案。tmp=sapply(db$performance,function(x){stru count(substrRight(x,18),“4”)}@ElChapo我认为有一种误解,即基于
sapply/lappy
的解决方案在速度方面优于
for
循环。我想说,事实并非如此。对我来说,如果我使用
lappy
而不是
For
循环,那么只需将输出清理干净,而不必初始化输出向量来存储每个循环中的输出就有意义了。thx u。这是我刚才写的一个解决方案。tmp=sapply(db$performance,function(x){stru count(substrRight(x,18),“4”)}@ElChapo我认为有一种误解,即基于
sapply/lappy
的解决方案在速度方面优于
for
循环。我想说,事实并非如此。对我来说,如果我使用
lappy
而不是
For
loop,那只是为了得到干净的输出,而不必初始化输出向量来存储每个循环中的输出
db <- structure(list(performance = c("1C1CCCCCCCCCCCCCCCCCCCCCC", "CCCCCCCCCCCCC", 
"4321CCCCCCCCCCCCCCCCCCCCC", "321CCCCCCCCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCC", 
"4321CCCCCCCCCCCCC0", "211CCCCCCCCCCCCCCCCCCCCCC", "BCCCCCCCCC", 
"BCCCCCCCCC", "8")), class = "data.frame", row.names = c(NA, 
-10L))