R是否具有像python一样的开头或结尾函数?[关闭]


72
> startsWith('abc', 'a')
[1] TRUE
> startsWith('abc', 'c')
[1] FALSE

> endsWith('abc', 'a')
[1] FALSE  
> endsWith('abc', 'c')
[1] TRUE

8
你可以使用正则表达式,如iris[grepl("^Petal",names(iris))]
thelatemail

Answers:


28

不是那种内在的。

选项包括greplsubstr

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'

13
(仅作说明)从R 3.3.0开始,功能startsWithendsWith存在。
alexis_laz

98

正如3.3.0中(和)所添加的base那样startsWithendsWith

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

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


2
谢谢,ijoseph,请在接受的答案下查看alexis_laz的评论。
user4015990 '16

@Chen-我想它仍然是答案,因为它是您最初想要的。评论不是一成不变的。
Rich Scriven

1
@Chen啊,我之前完全没有评论。
ijoseph '16

1
它是在3.3.0中添加的:“新的字符串实用程序startsWith(x, prefix)和” endsWith(x, suffix)。从R changelog cran.r-project.org/doc/manuals/r-devel/NEWS.html
弗兰克(Frank)

更新以增加确定性。感谢您进行调查,@FrankPinter。
ijoseph '18

12

dplyr软件包的select语句支持starts_withends_with。例如,这将选择以以下内容开头的虹膜数据框的列Petal

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

select也支持其他子命令。尝试?select


8

我能想到的最简单的方法是使用%like%运算符:

library(data.table)

"foo" %like% "^f" 

评估为TRUE-以f开头

"foo" %like% "o$" 

评估为TRUE-以o结尾

"bar" %like% "a"

评估为TRUE-包含一个


3

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

使用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

您可以使用子字符串将每个字符串切成所需的长度。长度是每个字符串开头要查找的字符数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.