我试图从数据库中的一列中提取NBA球员的名字。但是,names列中名称的格式如下:
" LeBron James \\ jamesle01"
我在子函数中使用了以下正则表达式来尝试仅保留名称部分:
sub("([A-Z]\\w+\\s*-*'*[a-z]*\\s*\\.*|[A-Z]\\.\\s*)\\*\\*[a-z]*\\d*\\d*", replacement = "\\1", x = nba_salaries$Names)
该表达式旨在考虑包含不仅仅是字母数字字符的不寻常名称(例如Michael Kidd-Gilchrist,De' Andre Jordan,Luc Mbah a Moute等)
但是,当我运行以下内容时,
head(nba_salaries$Names)
名称最终采用相同的格式。
我使用了regexr.com来确保正则表达式正确捕获字符串。
答案 0 :(得分:1)
这个怎么样,你可以用“\\”字符串拆分文本,然后只取第一个元素:
text <- c( "LeBron James\\jamesle01", "Michael Jordan\\jamesle01" )
sapply( strsplit( text, "\\\\" ), "[", 1 )
哪个给出了
[1] "LeBron James" "Michael Jordan"
解释。 “[”是一个函数*,在sapply
内被调用。因此,我们将strsplit
的结果作为X
sapply
传递给[
,并使用参数1
将text <- strsplit( text, "\\\\" )
函数应用于*,以获取第一个元素。这是另一种说法:
1
这将输出一个列表,每个列表元素包含一个向量,其中第一个元素是“\\”字符串之前的文本,第二个元素包含其后的任何文本。然后我们使用“[”函数*,传递参数text <- sapply( X = text, FUN = "[", 1 )
,以获取每个向量的第一个元素:
magrittr
编辑添加,我个人喜欢使用library( magrittr )
text <- strsplit( x = text, split = "\\\\" ) %>%
sapply( FUN = "[", 1 )
管道来做这样的事情,只是为了让它更具可读性:
[]
vector[1:3]
进行子集时调用的函数。例如:vector[1]
或在这种情况下SELECT product_service_id, product_service_name, product_service_category_name
FROM products_services
JOIN product_service_categories ON
products_services.product_service_category_id = product_service_categories.product_service_category_id
WHERE products_services.company_id = '7'
ORDER BY product_service_category_name, product_service_name
(感谢@MathewLundberg提出的建议)