解析单列中的文本

Parsing text in a single column

我正在尝试使用变量列中的术语,然后解析 "psi#.",留下其余部分。这个变量会随着时间而改变。

我试过了:

df <- psi2 <-  as.data.frame(piecewise_seg2$psi) %>%
 rownames_to_column( var = "variable") %>%
 separate(variable, c("psi*"))

但是,这就剩下 "psi." 我不知道正则表达式,但我试过了

str_split_fixed(psi2$variable, "psi*", "[abc]+$", 2)

那也没用。

我确实试图找到类似的东西,但大多是将一个字符向量解析为一个列表。有帮助吗?

如果您只想删除具有不同数字的 psi1.,您可以使用 str_replace:

df <- data.frame(var = c("psi2.1", "psi1.2", "psi33.55", "psi12.42"))
df %>% mutate(var = str_replace(var, "psi(\d+)\.", ""))
#   var
# 1   1
# 2   2
# 3  55
# 4  42

@Jaap 的解决方案:

gsub('psi\d+\.', '', psi2$variable)

和基准测试,我已将 stringi::stri_replace_first_regexperl = TRUE 添加到 gsub:

microbenchmark::microbenchmark(
  str_replace = str_replace(df$var, "psi\d+\.", ""),
  stri_replace_all = stringi::stri_replace_first_regex(df$var, "psi\d+\.", ""),
  sub = sub(".*\.", "", df$var),
  gsub = gsub('psi\d+\.', '', df$var),
  gsub_perl = gsub('psi\d+\.', '', df$var, perl = TRUE),
  times = 10000
)

Unit: microseconds
             expr    min      lq      mean  median      uq       max neval
      str_replace 96.661 106.101 129.08727 110.632 117.805  3951.009 10000
 stri_replace_all 28.319  33.228  41.57426  36.626  39.647  1980.413 10000
              sub 14.349  17.369  22.21423  19.257  23.033  1682.124 10000
             gsub 18.879  22.278  34.89121  24.921  28.697 63495.163 10000
        gsub_perl 76.272  79.293  88.32751  81.558  84.956  1865.251 10000

sub 解决方案是最快的。

在更大的数据集上应用基准:

df <- df[sample(nrow(df), 1e6, replace = TRUE), , drop = FALSE]

microbenchmark::microbenchmark(
  str_replace = str_replace(df$var, "psi\d+\.", ""),
  stri_replace_all = stringi::stri_replace_first_regex(df$var, "psi\d+\.", ""),
  sub = sub(".*\.", "", df$var),
  gsub = gsub('psi\d+\.', '', df$var),
  gsub_perl = gsub('psi\d+\.', '', df$var, perl = TRUE),
  times = 50
)

结果:

Unit: milliseconds
             expr      min       lq     mean   median       uq      max neval  cld
      str_replace 293.2773 301.9520 311.9032 308.5192 322.4974 344.7649    50  b  
 stri_replace_all 294.8729 298.8479 316.9213 306.4369 317.3555 518.5287    50  b  
              sub 468.2134 473.1803 487.0336 485.1354 498.1503 527.2476    50   c 
             gsub 649.6209 673.4312 690.7942 683.6022 701.3134 909.2599    50    d
        gsub_perl 251.0663 255.1404 263.9778 260.3426 274.6684 287.3492    50 a   

如果你想删除 psi. 你可以使用基础 R

中的 sub 函数
j=c("psi1.rba_bucket","psi2.rba_bucket","psi1.credit_tier_bucket")
sub(".*\.","",j)
[1] "rba_bucket"         "rba_bucket"        
[3] "credit_tier_bucket"

sub("psi..","",j)
[1] "rba_bucket"         "rba_bucket"        
[3] "credit_tier_bucket"