0

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

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

    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
4

3 回答 3

3

使用捕获组:

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

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

于 2015-01-28T21:27:21.257 回答
1

正则表达式(?<=^.{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 个数字之后的所有数字替换为空字符串。

于 2015-01-29T21:44:43.570 回答
1

使用匹配整个字符串的模式捕获前 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 字符串太短。)

于 2015-01-28T21:29:39.460 回答