【问题标题】:R use gsub as substrR 使用 gsub 作为 substr
【发布时间】:2015-01-30 05:46:14
【问题描述】:

我正在使用 H2O 进行一些分布式计算工作(通过 R 中的 h2o 包)。许多基本的 R 函数都存在,但我无法找到合适的替代 substr 函数。我确实可以访问subgsub 函数,并希望可能使用某种形式的正则表达式作为解决方法。

我正在使用以下代码,但没有任何运气:

    df1 <- data.frame(id = 1:10, var1 = seq(14102201,14103200, 100))
    df1$var2 <- substr(df1$var1, 1,6)
    df1$var3 <- gsub('\\d{1,8}','\\d{1,6}', df1$var1)
    df1

df1$var2 中的输出是我正在寻找的。有什么建议吗?

编辑: 运行此代码:

library(h2o)
localH2O = h2o.init(nthreads = 2) 
df1 <- data.frame(id = 1:10, var1 = seq(14102201,14103200, 100))
df1.hex <- as.h2o(localH2O , df1)
df1.hex$var2 <- substr(df1.hex$var1, 1, 6)

收到此消息:

> df1.hex$var2 <- substr(df1.hex$var1, 1, 6)
Error in as.character.default(x) : 
  no method for coercing this S4 class to a vector

【问题讨论】:

  • substr() 有什么问题?它的干净做你想要的。您关心效率吗?
  • @RichardScriven:它不适用于 H2O 对象。
  • 只是好奇,它触发的错误是什么?我问是因为gsubsubstr 使用相同的参数检查
  • @RichardScriven:见上面的编辑。

标签: regex r gsub h2o


【解决方案1】:

使用捕获组:

gsub('(.+)..','\\1', df1$var1)

此正则表达式将 (.+).. 与 df1$var1 匹配,并将其替换为与第一个捕获组 (.+) 匹配的子字符串。由于正则表达式末尾有..,因此最后两个字符与.+不匹配,因此它们不在结果中。

【讨论】:

  • 这会修剪字符串中的最后 2 个元素,在这种情况下,会保留前 6 个元素。
  • gsub('(.{6}).*','\\1', df1$var1)substr(x,1,6) 的更直译。
【解决方案2】:

使用匹配整个字符串的模式捕获前 6 个值

gsub('^(.{6}).*$','\\1', df1$var1)

substr(x,start,stop) 的一个更通用的替代品是

if(start > 1)
     gsub('^(.{*start-1*})(.{*stop-start+1*})).*$','\\1', 'asdfhjkl')
else
     gsub('^(.{*stop*})).*$','\\1', 'asdfhjkl')

* 字符之间的值是表达式的实际整数值。 (尽管您必须确保 nchar(x) 小于 stop,否则模式将不匹配 b/c 字符串太短。)

【讨论】:

    【解决方案3】:

    正则表达式 (?&lt;=^.{6}).*$ 匹配前 6 个字符之后的所有字符。如果你想用sub替换substr(df1$var1, 1, 6),你可以使用这个命令:

    sub('(?<=^.{6}).*$', '', df1$var1, perl = TRUE)
    
    # [1] "141022" "141023" "141024" "141025" "141026" "141027" "141028" "141029"
    # [9] "141030" "141031"
    

    此命令将前 6 个数字之后的所有数字替换为空字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多