我在R中有一个包含字母和数字的列的数据框。字母和数字的数量各不相同,因此解析将非常困难。我想要做的只是创建一个列,其中只包含包含字母和数字的列中的字母。典型的观察结果看起来像ABS98或GD798。
由于
答案 0 :(得分:5)
一种方法是通过gsub()
使用正则表达式。使用类似数据的东西:
df <- data.frame(Ind = rep(c("ABS98","GD798"), each = 5), Dat = rnorm(10))
一个可能的正则表达式是:
with(df, gsub("[[:digit:]]", "", Ind))
其中"[[:digit:]]"
匹配您的语言环境中数字的任何传递,并用空字符串""
替换这些位。这给了我们:
> with(df, gsub("[[:digit:]]", "", Ind))
[1] "ABS" "ABS" "ABS" "ABS" "ABS" "GD" "GD" "GD" "GD" "GD"
要将其添加为列,请覆盖Ind
:
df2 <- transform(df, Ind = gsub("[[:digit:]]", "", Ind))
> head(df2)
Ind Dat
1 ABS 0.3685773
2 ABS 0.1186962
3 ABS -0.1049685
4 ABS -0.2448743
5 ABS -0.1896105
6 GD 0.8206612
或添加新的
df3 <- transform(df, Ind2 = gsub("[[:digit:]]", "", Ind))
> head(df3)
Ind Dat Ind2
1 ABS98 0.3685773 ABS
2 ABS98 0.1186962 ABS
3 ABS98 -0.1049685 ABS
4 ABS98 -0.2448743 ABS
5 ABS98 -0.1896105 ABS
6 GD798 0.8206612 GD
取决于哪种情况最适合您的用例。
答案 1 :(得分:3)
gsub非常适合。使用它来去除所有数字并将结果放在col2(或任何目标字段)。
df=data.frame(col1=c("ABS98", "GD798", "45j9s"))
df$col2=gsub("[0-9]","",df$col1)
答案 2 :(得分:2)
使用stri_replace_charclass
包中的stringi
功能:
stri_replace_all_charclass(c("AB89","DB12"),"\\p{N}","")
## [1] "AB" "DB"
第一个参数是你要修改的矢量,第二个是字符类(在这种情况下是N - 数字),第三个是替换 - 一个空字符串。
x <- stri_rand_strings(1000,10,c("[A-Z]","[0-9]"))
x[1:6]
## [1] "OGYLERNWUV" "2397448180" "DPQWSDODVD" "4176825763" "GEFNQMIXMO" "7178890572"
microbenchmark(stri_replace_all_charclass(x,"\\p{N}",""), gsub("[0-9]","",x,perl = TRUE), gsub("[0-9]","",x))
Unit: microseconds
expr min lq median uq max neval
stri_replace_all_charclass(x, "\\\\p{N}", "") 385.002 398.2755 405.5475 415.9865 603.859 100
gsub("[0-9]", "", x, perl = TRUE) 748.432 756.3290 763.3345 779.4150 1127.759 100
gsub("[0-9]", "", x) 1452.630 1467.0205 1482.3825 1503.4140 1755.422 100