13

列の文字列値に「*」を含むテーブルの行を除外したいと考えています。その列だけをチェックします。

 string_name = c("aaaaa", "bbbbb", "ccccc", "dddd*", "eee*eee")

 zz <- sapply(tx$variant_full_name, function(x) {substrRight(x, -1) =="*"})
 Error in FUN(c("Agno I30N", "VP2 E17Q", "VP2 I204*", "VP3 I85F", "VP1 K73R",  : 
   could not find function "substrRight"

これで zz の 4 番目の値が TRUE になるはずです。

Python には、文字列の endwith 関数があります [ string_s.endswith('*') ] R に似たようなものはありますか?

また、「*」は任意の文字を意味するため、文字として問題がありますか? grepも機能しません。

> grepl("*^",'dddd*')
[1] TRUE
> grepl("*^",'dddd')
[1] TRUE
4

5 に答える 5

13

*正規表現の量指定子です。正規表現エンジンに、前のトークンを「0回以上」照合するように指示します。リテラルに一致させるには、その前に 2 つのバックスラッシュを付けるか、文字クラス内に配置する必要があります[*]。文字列が特定のパターンで終わっているかどうかを確認するには、文字列アンカーの終わりを$ 使用します。

> grepl('\\*$', c('aaaaa', 'bbbbb', 'ccccc', 'dddd*', 'eee*eee'))
# [1] FALSE FALSE FALSE  TRUE FALSE

ベース R に正規表現を実装せずに、これを簡単に実行できます。

> x <- c('aaaaa', 'bbbbb', 'ccccc', 'dddd*', 'eee*eee')
> substr(x, nchar(x)-1+1, nchar(x)) == '*'
# [1] FALSE FALSE FALSE  TRUE FALSE
于 2014-10-04T01:14:47.967 に答える
8

これは、正規表現を必要としないほど単純です。

> string_name = c("aaaaa", "bbbbb", "ccccc", "dddd*", "eee*eee")
> substring(string_name, nchar(string_name)) == "*"
[1] FALSE FALSE FALSE  TRUE FALSE
于 2014-10-04T02:19:30.287 に答える
5

私は次のようなものを使用します:

strEndsWith <- function(haystack, needle)
{
  hl <- nchar(haystack)
  nl <- nchar(needle)
  if(nl>hl)
  {
    return(F)
  } else
  {
    return(substr(haystack, hl-nl+1, hl) == needle)
  }
}
于 2015-04-22T05:47:24.390 に答える