2

我的任务是从字符串中拆分并提取部分,直到出现第四个下划线。我现在正在使用 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"
>

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

4

2 回答 2

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')

教程在这里

于 2012-12-20T12:40:30.263 回答
2

stringr 软件包有许多用于此类工作的便捷快捷方式:

# 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

于 2012-12-20T21:52:02.290 回答