Использовать группу захвата в gsub () как индекс / имя для другого объекта (R) [дублировать]

В PHP оба 'my name' и "my name" являются строками. Вы можете узнать больше об этом в руководстве по PHP .

Вещь, которую вы должны знать, это

$a = 'name';
$b = "my $a"; == 'my name'
$c = 'my $a'; != 'my name'

. В PHP люди используют одиночную кавычку для определения константа, например 'a', 'my name', 'abc xyz', используя двойную кавычку для определения строки, содержащей идентификатор, такой как "a $b $c $d".

И еще:

echo 'my name';

быстрее, чем

echo "my name";

, но

echo 'my ' . $a;

медленнее, чем

echo "my $a";

Это верно для других, используемых в строке.

1
задан JMD 26 August 2014 в 14:02
поделиться

2 ответа

R не имеет возможности применить функцию непосредственно к совпадению через gsub. Вам действительно нужно извлечь совпадение, преобразовать значение, а затем заменить значение. С функцией regmatches это легко релятивируется. Например,

x<-"(990283)M (31)O (29)M (6360)M"

f<-function(x) {
    v<-as.numeric(substr(x,2,nchar(x)-1))
    paste0(v+5,".1")
}

m <- gregexpr("\\(\\d+\\)", x)
regmatches(x, m) <- lapply(regmatches(x, m), f)
x
# [1] "990288.1M 36.1O 34.1M 6365.1M"

Конечно, вы можете сделать f делать все, что вам нравится, просто убедиться, что он удобен для вектора. Конечно, вы можете обернуть это в свою собственную функцию

gsubf <- function(pattern, x, f) {
    m <- gregexpr(pattern, x)
    regmatches(x, m) <- lapply(regmatches(x, m), f)
    x   
}
gsubf("\\(\\d+\\)", x, f)

. Обратите внимание, что в этих примерах мы не используем группу захвата, мы просто хватаем весь матч. Есть способы извлечь группы захвата, но они немного беспорядочны. Если вы хотите представить пример, где требуется такое извлечение, я мог бы придумать что-то более приятное.

4
ответ дан MrFlick 25 August 2018 в 09:35
поделиться

Это для нескольких разных замен.

text="foo(200) (300)bar (400)foo (500)bar (600)foo (700)bar"

f=function(x)
{
  return(as.numeric(x[[1]])+5)
}
a=strsplit(text,"\\(\\K\\d+",perl=T)[[1]]

b=f(str_extract_all(text,perl("\\(\\K\\d+")))

paste0(paste0(a[-length(a)],b,collapse=""),a[length(a)])  #final output
#[1] "foo(205) (305)bar (405)foo (505)bar (605)foo (705)bar"
0
ответ дан sidpat 25 August 2018 в 09:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: