web-dev-qa-db-fra.com

Est-ce que R a une fonction beginwith ou endswith comme python?

La question est très claire dans le titre.

60
Chen

Comme ajouté à base dans 3.3. , startsWith (et endsWith) sont exactement ceci.

> 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

Pas intégré comme ça.

Les options incluent grepl et 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
mathematical.coffee

L'instruction select du paquet dplyr prend en charge starts_with et ends_with. Par exemple, cela sélectionne les colonnes du cadre de données de l’iris commençant par Petal

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

select prend également en charge d'autres sous-commandes. Essayez ?select.

11
G. Grothendieck

Le moyen le plus simple auquel je puisse penser est d'utiliser le %like% opérateur:

library(data.table)

"foo" %like% "^f" 

évalue comme TRUE - à partir de f

"foo" %like% "o$" 

évalue comme TRUE - Se terminant par o

"bar" %like% "a"

évalue comme TRUE - contenant a

6
DaniGate

Ceci est relativement simple en utilisant la fonction substring:

> 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

Vous coupez chaque chaîne à la longueur souhaitée avec une sous-chaîne. La longueur étant le nombre de caractères que vous recherchez au début de chaque chaîne.

3
Maxime Biette

En empruntant du code du paquetage dplyr[voir ceci] , vous pourriez faire quelque chose comme ceci:

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