我的任务是从字符串中拆分并提取部件,直到出现第四个下划线。 我现在正在和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"
>
显然该命令有效,但它不适用于矩阵..
答案 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