python - if endswith
¿R tiene una función que comienza o termina como python? (6)
Como se
agregó a la
base
en 3.3.0
,
startsWith
(y
endsWith
) son exactamente esto.
> startsWith("what", "wha")
[1] TRUE
> startsWith("what", "ha")
[1] FALSE
https://stat.ethz.ch/R-manual/R-devel/library/base/html/startsWith.html
La pregunta es muy clara en el título.
Esto es relativamente simple usando la función de subcadena:
> 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
Cortas cada cuerda a la longitud deseada con subcadena. La longitud es el número de caracteres que está buscando al comienzo de cada cadena.
La forma más simple que se me ocurre es usar el operador
%like%
:
library(data.table)
"foo" %like% "^f"
evalúa como
TRUE
- Comenzando con
f
"foo" %like% "o$"
se evalúa como
TRUE
- Terminando con
o
"bar" %like% "a"
se evalúa como
TRUE
: contiene
un
La instrucción de
select
del paquete dplyr admite
starts_with
y
ends_with
.
Por ejemplo, esto selecciona las columnas del marco de datos del iris que comienzan con
Petal
library(dplyr)
select(iris, starts_with("Petal"))
select
admite otros subcomandos.
Intenta
?select
.
No incorporado así.
Las opciones incluyen
grepl
y
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''
Tomando prestado algún código del paquete
dplyr
[vea esto]
podría hacer algo como esto:
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
}