选择以R中的数字开头的字符串

时间:2014-08-26 18:25:50

标签: r

这很简单,但我无法100%正确!

我的数据列如下:

"424343 Amsterdam center" 
"343423 London 42 ......"
"3434   Prague ........." 
"343345 Bratislava ...."
"! last entry ..... 25.08.2014..."
"Berlin"
...
...

我想用空字符串""

替换以字母开头的所有行

我试过了:

dataframe$column[grepl("(^[A-Z]+).*",dataframe$column)] <- ""

我仍然得到像这样的行....... "! last entry ..... 25.08.2014..."

期望的输出:

 "424343 Amsterdam center" 
 "343423 London 42 ......"
 "3434   Prague ........." 
 "343345 Bratislava ...."
 ""
 ""
...
...

3 个答案:

答案 0 :(得分:2)

您可以查看以至少一个数字开头的字符串,并获取所有不匹配的结果(使用!),例如:

!grepl("^[[:digit:]]+", text)

在你的例子中:

dataframe$column[!grepl("^[[:digit:]]+",dataframe$column)] <- ""

答案 1 :(得分:2)

这是我构建我怀疑为OP造成问题的策略:

> inp <- scan(what="")
1: "424343 Amsterdam center" 
2: "343423 London 42 ......"
3: "3434   Prague ........." 
4: "343345 Bratislava ...."
5: "! last entry ..... 25.08.2014..."
6: "Berlin"
7: 

dat <- data.frame(inp=inp)

我怀疑他看到了什么:

> dat$inp[grepl("(^[A-Z]+).*",dat$inp)] <- ""
Warning message:
In `[<-.factor`(`*tmp*`, grepl("(^[A-Z]+).*", dat$inp), value = c(5L,  :
  invalid factor level, NA generated
> dat
                               inp
1          424343 Amsterdam center
2          343423 London 42 ......
3          3434   Prague .........
4           343345 Bratislava ....
5 ! last entry ..... 25.08.2014...
6                             <NA>

因此,我在评论中提出的方法是两种可能性之一:

dat <- data.frame(inp=inp, stringsAsFactors=FALSE)  # option 1
dat$inp <- as.character(dat$inp)         # convert factor to character

然后OP的代码按预期工作:

> dat$inp[grepl("(^[A-Z]+).*",dat$inp)] <- ""
> dat
                               inp
1          424343 Amsterdam center
2          343423 London 42 ......
3          3434   Prague .........
4           343345 Bratislava ....
5 ! last entry ..... 25.08.2014...
6                                 

答案 2 :(得分:0)

这样的东西?

dataframe$column[grepl("^[^0-9]",dataframe$column)] <- ""