我正在使用H2O进行一些分布式计算工作(通过R中的h2o
包)。 许多基本的 R 函数都存在,但我找不到合适的替代 substr
函数。 我确实可以访问sub
和gsub
功能,并希望可能使用某种形式的正则表达式作为解决方法。
我正在使用以下代码,但没有任何运气:
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 个数字之后的所有数字替换为空字符串。