【问题标题】:truncate string from a certain character in R [duplicate]从R中的某个字符截断字符串[重复]
【发布时间】:2011-07-28 15:40:40
【问题描述】:

我在 R 中有一个字符串列表,如下所示:

WDN.TO
WDR.N
WDS.AX
WEC.AX
WEC.N
WED.TO

我想获取从字符“.”开始的所有字符串的后缀,结果应该是这样的:

.TO
.N
.AX
.AX
.N
.TO

有人有什么想法吗?

【问题讨论】:

标签: string r truncate


【解决方案1】:

Joshua 的解决方案运行良好。我会使用sub 而不是gsubgsub 用于替换字符串中多次出现的模式 - sub 用于一次出现。模式也可以简化一点:

> x <- c("WDN.TO","WDR.N","WDS.AX","WEC.AX","WEC.N","WED.TO")
> sub("^[^.]*", "", x)
[1] ".TO" ".N"  ".AX" ".AX" ".N"  ".TO"

...但是如果字符串和问题中的一样规则,那么只需去除前 3 个字符就足够了:

> x <- c("WDN.TO","WDR.N","WDS.AX","WEC.AX","WEC.N","WED.TO")
> substring(x, 4)
[1] ".TO" ".N"  ".AX" ".AX" ".N"  ".TO"

【讨论】:

  • 您能否真正快速地解释一下该模式是如何被检测到的?我看不懂sub("^[^.]*", "", x)。那是一个占位符,然后是一个带有占位符的过滤器,但是星号是做什么的,为什么在x 之前是空的""?我可以调整代码使其工作,但我不明白它是如何工作的......
  • 这是一个正则表达式模式。第一个^ 匹配字符串的开头,但方括号中的下一个取反,因此它匹配除“。”之外的所有字符。 - 最后,星表示匹配任意次数 - 所以匹配从开始到(但不包括)第一个点的所有内容。然后第二个参数将匹配替换为空字符串。
【解决方案2】:

使用gsub

x <- c("WDN.TO","WDS.N")
# replace everything from the start of the string to the "." with "."
gsub("^.*\\.",".",x)
# [1] ".TO" ".N" 

使用strsplit

# strsplit returns a list; use sapply to get the 2nd obs of each list element
y <- sapply(strsplit(x,"\\."), `[`, 2)
# since we split on ".", we need to put it back
paste(".",y,sep="")
# [1] ".TO" ".N"

【讨论】:

    【解决方案3】:

    Strsplit 可能会这样做,但如果数据集太大,它会显示错误 下标越界

    x <- c("WDN.TO","WDR.N","WDS.AX","WEC.AX","WEC.N","WED.TO")
    y <- strsplit(x,".")[,2]
    #output y= TO N AX AX N TO
    

    【讨论】:

      猜你喜欢
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      相关资源
      最近更新 更多