2015-01-28 2 views
0

Я использую H2O для некоторых распределенных вычислительных работ (через пакет h2o в R). Многие из базовых функций R присутствуют, но я не могу найти подходящую замену для функции substr. У меня есть доступ к функциям sub и gsub и надеялся, что в качестве обходного пути можно использовать некоторую форму регулярного выражения.R use gsub as substr

Я использую следующий код, но не имея каких-либо удачи:

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 является то, что я ищу. Какие-либо предложения?

EDIT: Выполнение этого кода:

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 
+0

Что случилось с 'substr()'? Это чисто делает то, что вы хотите. Вы обеспокоены эффективностью? –

+0

@RichardScriven: он не работает с объектом H2O. – screechOwl

+0

Просто любопытно, что это за ошибка? Я спрашиваю, потому что 'gsub' и' substr' используют те же проверки аргументов –

ответ

3

Использование захвата групп:

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

Это регулярное выражение соответствует .. с (+). df1$var1, и замените его подстрокой, соответствующей первой группе захвата (.+). Поскольку в конце регулярного выражения есть .., последние два символа не совпадают с .+, поэтому они не являются результатом.

+0

Это обрезает последние 2 элемента из строки, которые в этом случае случаются, оставляя первое 6. – Jthorpe

+0

'gsub ('(. {6}). *', '\\ 1', df1 $ var1)' является более буквальный перевод 'substr (x, 1,6)'. – Jthorpe

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, иначе шаблоны не будут соответствовать б/с строка слишком коротка.)

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 из них с пустой строкой.