web-dev-qa-db-ja.com

Rにはpythonのようなstartswithまたはendswith機能がありますか?

質問はタイトルで非常に明確です。

60
Chen

.3.0でbaseに追加 のように、startsWith(およびendsWith)はまさにこれです。

> startsWith("what", "wha")
[1] TRUE
> startsWith("what", "ha")
[1] FALSE

https://stat.ethz.ch/R-manual/R-devel/library/base/html/startsWith.html

83
ijoseph

そのように組み込まれていません。

オプションには、greplおよびsubstrが含まれます。

x <- 'ABCDE'
grepl('^AB', x) # starts with AB?
grepl('DE$', x) # ends with DE?
substr(x, 1, 2) == 'AB'
substr('ABCDE', nchar(x)-1, nchar(x)) == 'DE'
23

Dplyrパッケージのselectステートメントは、starts_withおよびends_withをサポートしています。たとえば、これはPetalで始まる虹彩データフレームの列を選択します

library(dplyr)
select(iris, starts_with("Petal"))

selectは他のサブコマンドもサポートします。 ?selectを試してください。

11
G. Grothendieck

私が考えることができる最も簡単な方法は、%like%演算子を使用することです:

library(data.table)

"foo" %like% "^f" 

TRUEとして評価-fで始まる

"foo" %like% "o$" 

TRUEとして評価されます-oで終わる

"bar" %like% "a"

TRUEとして評価-含むa

6
DaniGate

これは、サブストリング関数を使用することで比較的簡単です。

> strings = c("abc", "bcd", "def", "ghi", "xyzzd", "a")
> str_to_find = "de"
> substring(strings, 1, nchar(str_to_find)) == str_to_find
[1] FALSE FALSE  TRUE FALSE FALSE FALSE

各文字列を部分文字列で目的の長さに切り取ります。長さは、各文字列の先頭で探している文字数です。

3
Maxime Biette

dplyrパッケージからいくつかのコードを借りる [参照] 次のようなことができます:

starts_with <- function(vars, match, ignore.case = TRUE) {
  if (ignore.case) match <- tolower(match)
  n <- nchar(match)

  if (ignore.case) vars <- tolower(vars)
  substr(vars, 1, n) == match
}

ends_with <- function(vars, match, ignore.case = TRUE) {
  if (ignore.case) match <- tolower(match)
  n <- nchar(match)

  if (ignore.case) vars <- tolower(vars)
  length <- nchar(vars)

  substr(vars, pmax(1, length - n + 1), length) == match
}
3
JasonAizkalns