解析单列中的文本
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_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
如果你想删除 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"
我正在尝试使用变量列中的术语,然后解析 "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_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
如果你想删除 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"