我正在尝试在变量列中使用该术语,并解析“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)
这也不起作用。
我确实试图找到这样的东西,但大多数时候发现将一个字符向量解析为一个列表。有什么帮助吗?
答案 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_regex
和perl = 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"