Does R have function startswith or endswith like p

2019-01-11 15:46发布

Was looking for predictors whose name starts with some substring, could not find any similar function.

6条回答
The star\"
2楼-- · 2019-01-11 16:14

As added to base in 3.3.0, startsWith (and endsWith) are exactly this.

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

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

查看更多
甜甜的少女心
3楼-- · 2019-01-11 16:21

Not inbuilt like that.

Options include grepl and 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'
查看更多
女痞
4楼-- · 2019-01-11 16:31

The dplyr package's select statement supports starts_with and ends_with. For example, this selects the columns of the iris data frame that start with Petal

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

select supports other subcommands too. Try ?select .

查看更多
劳资没心,怎么记你
5楼-- · 2019-01-11 16:33

This is relatively simple by using the substring function:

> 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

You cut each string to the desired length with substring. The length being the number of characters you are looking for at the beginning of each string.

查看更多
做个烂人
6楼-- · 2019-01-11 16:34

The simplest way I can think of is to use the %like% operator:

library(data.table)

"foo" %like% "^f" 

evaluates as TRUE - Starting with f

"foo" %like% "o$" 

evaluates as TRUE - Ending with o

"bar" %like% "a"

evaluates as TRUE - Containing a

查看更多
Viruses.
7楼-- · 2019-01-11 16:38

Borrowing some code from the dplyr package [see this] you could do something like this:

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
}
查看更多
登录 后发表回答