根据字符的出现拆分字符串

时间:2012-12-20 12:34:11

标签: r substr

我的任务是从字符串中拆分并提取部件,直到出现第四个下划线。 我现在正在和R一起工作,但我是一个有编程和东西的初学者。

输入如下:

6_10_36_0_1
6_10_38_16_15
6_100_76_16_18.1

我要求的结果如下:

6_10_36_0
6_10_38_16
6_100_76_16

我的想法如下:

substr(data$x, 0, XXX)

虽然XXX定义了第四个下划线之前的位置,但可能使用grep或strsplit?

很抱歉,如果我问了一个愚蠢且易于回答的问题。但是我没有找到适合已发布的答案。


编辑:

> bestand$ID<-sub("(_[0-9.]+$)", "", bestand$x)
Fehler in `$<-.data.frame`(`*tmp*`, "ID", value = character(0)) : 
  replacement has 0 rows, data has 36513
> gsub("(_[0-9.]+$)", "", "6_100_63_8_2")
[1] "6_100_63_8"
>

显然该命令有效,但它不适用于矩阵..

2 个答案:

答案 0 :(得分:3)

你可以使用正则表达式替换为null,在php中我们

$string = '6_10_36_0_1';
$newstring =preg_replace('/(_[0-9.]+$)/', '', $string);

编辑(我完全不知道r,但大概就是这样)

sub("(_[0-9.]+$)", "", 'your strings or array of strings')

gsub("(_[0-9.]+$)", "", 'your strings or array of strings')

,教程为here

答案 1 :(得分:2)

stringr package为此类工作提供了许多便捷的快捷方式:

# input data   
data <- read.table(text = "6_10_36_0_1
6_10_38_16_15
6_100_76_16_18.1")

# load library
library(stringr)

# prepare regular expression
regexp <- "([[:digit:]]+_){3}[[:digit:]]+"

# process string
(str_extract(data$V1, regexp))

这给出了期望的结果:

[1] "6_10_36_0"   "6_10_38_16"  "6_100_76_16"

解释一下regexp

[[:digit:]]是0到9之间的任何数字

+表示前一项(在本例中为数字)将匹配一次或多次

_是下划线,

{3}表示重复上一个字符串三次

此页面对于此类字符串处理也非常有用:http://en.wikibooks.org/wiki/R_Programming/Text_Processing