【问题标题】:Split string according to occurrence of a character根据字符的出现拆分字符串
【发布时间】:2012-12-20 12:34:10
【问题描述】:

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

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

【问题讨论】:

  • 看起来您的bestand 数据框实际上没有x 组件? names(bestand) 的结果是什么,或者更好的str(bestand) [如果bestand 没有大量的行]?

标签: r substr


【解决方案1】:

你可以用正则表达式替换为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

【讨论】:

  • 感谢您的回答!我试图在 R 中使用你的线路,但没有成功。你知道R中对应的命令吗?
  • for r 我认为 sub() 和 gsub() @user1918745
【解决方案2】:

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

# 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

【讨论】:

  • regexp &lt;- "([[:digit:]]+_){3}[[:digit:]]+" 怎么样?它似乎给出了正确的结果,并且至少更容易输入......
猜你喜欢
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2019-09-19
相关资源
最近更新 更多