在单列中解析文本

时间:2018-01-26 15:08:42

标签: r data-manipulation stringr

我正在尝试在变量列中使用该术语,并解析“psi#”。离开休息。这些变量会随着时间而改变。

enter image description here

我试过了:

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)

这也不起作用。

我确实试图找到这样的东西,但大多数时候发现将一个字符向量解析为一个列表。有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

如果您想删除不同号码的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   

答案 1 :(得分:3)

如果您要删除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"