8

Rの関数を使用してgsub、テキストのリストでパターン (参照番号) の出現を返しています。これは、一致するものが見つからない場合を除いてうまく機能します。その場合、空の文字列ではなく、文字列全体が返されます。例を考えてみましょう:

data <- list("a sentence with citation (Ref. 12)",
             "another sentence without reference")

sapply(data, function(x) gsub(".*(Ref. (\\d+)).*", "\\1", x))

戻り値:

[1] "Ref. 12"                            "another sentence without reference"

しかし、私は取得したいです

[1] "Ref. 12"                            ""

ありがとう!

4

7 に答える 7

7

sapplyこれらの関数は既にベクトル化されているため、私には必要ないように思われるため、おそらく別のルートに進むでしょう。

fun <- function(x){
    ind <- grep(".*(Ref. (\\d+)).*",x,value = FALSE)
    x <- gsub(".*(Ref. (\\d+)).*", "\\1", x)
    x[-ind] <- ""
    x
}

fun(data)
于 2012-04-18T17:41:05.367 に答える
5

ドキュメントによると、これはgsub、指定されたパターンに一致するものがない場合に入力文字列を返す機能であり、一致すると文字列全体が返されます。

ここでは、最初に関数を使用してgrepl、指定された文字列内のパターンの有無の論理ベクトルを返します。

ifelse(grepl(".*(Ref. (\\d+)).*", data), 
      gsub(".*(Ref. (\\d+)).*", "\\1", data), 
      "")

これを関数に埋め込む:

mygsub <- function(x){
     ans <- ifelse(grepl(".*(Ref. (\\d+)).*", x), 
              gsub(".*(Ref. (\\d+)).*", "\\1", x), 
              "")
     return(ans)
}

mygsub(data)
于 2012-04-18T17:45:21.793 に答える
2
xs <- sapply(data, function(x) gsub(".*(Ref. (\\d+)).*", "\\1", x))
xs[xs==data] <- ""
xs
#[1] "Ref. 12" ""       
于 2012-04-18T17:49:28.210 に答える
1

strapplycgsubfn パッケージで試してください:

library(gsubfn)

L <- fn$sapply(unlist(data), ~ strapplyc(x, "Ref. \\d+"))
unlist(fn$sapply(L, ~ ifelse(length(x), x, "")))

これにより、次のようになります。

a sentence with citation (Ref. 12) another sentence without reference 
                         "Ref. 12"                                 "" 

リスト出力を気にしない場合は、L を使用して、コードの最後の行を忘れることができます。fn$プレフィックスは、適用先の関数の数式引数を関数呼び出しに変換するため、コードの最初の行はfnas なしで記述できることに注意してくださいsapply(unlist(data), function(x) strapplyc(x, "Ref x. \\d+"))

于 2012-04-19T04:25:22.740 に答える
0

その関数に埋め込んgrep( ..., value = T)でみてください。

data <- list("a sentence with citation (Ref. 12)",
         "another sentence without reference")

unlist( sapply(data, function(x) { 
  x <- gsub(".*(Ref. (\\d+)).*", "\\1", x)
  grep( "Ref\\.", x, value = T )
  } ) )

かさばりますが、機能しますか?また、空の 2 番目の参照も削除されます。

于 2012-04-18T17:33:43.877 に答える