R 使用 gsub 作为子 str



我正在使用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

使用捕获组:

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

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

像这样使用与整个刺痛匹配的模式捕获前 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 字符串太短。

则表达式(?<=^.{6}).*$匹配前 6 个字符之后的字符。如果要将substr(df1$var1, 1, 6)替换为 sub ,可以使用以下命令:

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

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

相关内容

  • 没有找到相关文章

最新更新