仅从其他列创建列文本

时间:2014-07-24 22:14:17

标签: r string replace

我在R中有一个包含字母和数字的列的数据框。字母和数字的数量各不相同,因此解析将非常困难。我想要做的只是创建一个列,其中只包含包含字母和数字的列中的字母。典型的观察结果看起来像ABS98或GD798。

由于

3 个答案:

答案 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