gpt4 book ai didi

r - 如何在 R 中使用带参数的 grep?

转载 作者:行者123 更新时间:2023-12-02 05:23:05 26 4
gpt4 key购买 nike

显然我不明白 grep 在 R 中的工作方式。如果我在我的 OS X 终端上使用 grep,我可以使用参数 -o 使 grep 只返回匹配的部分。在 R 中,我找不到如何做相应的事情。阅读手册我认为值是正确的方法,这是更好的因为它返回字符而不是索引,但仍然返回整个字符串。

# some string  fasdjlk465öfsdj123 
# R
test <- fasdjlk465öfsdj123
grep("[0-9]",test,value=TRUE) # returns "fasdjlk465öfsdj123"

# shell
grep -o '[0-9]' fasdjlk465öfsdj123
# returns 4 6 5 1 2 3

我在 R 中缺少的参数是什么?

编辑:Joris Meys 的建议非常接近我正在尝试做的事情。由于 readLines,我得到了一个向量。我想检查向量的每个元素的数字并返回这些数字。我真的很惊讶没有标准的解决方案。我想过使用一些适用于字符串的正则表达式函数并返回像 grep -o 这样的匹配项,然后在该向量上使用 lapply 。 grep.custom 最接近——我会尽力让它为我工作。

最佳答案

Spacedman 已经说过了。如果你真的想在 shell 中模拟 grep,你必须使用 strsplit() 处理字符本身:

> chartest <- unlist(strsplit(test,""))
> chartest
[1] "f" "a" "s" "d" "j" "l" "k" "4" "6" "5" "ö" "f" "s" "d" "j" "1" "2" "3"
> grep("[0-9]",chartest,value=T)
[1] "4" "6" "5" "1" "2" "3"

编辑:

正如 Nico 所说,如果要对完整的正则表达式执行此操作,则需要使用 gregexpr()substr()。我会制作一个像这样的自定义函数:

grep.custom <- function(x,pattern){
strt <- gregexpr(pattern,x)[[1]]
lngth <- attributes(strt)$match.length
stp <- strt + lngth - 1
apply(cbind(strt,stp),1,function(i){substr(x,i[1],i[2])})
}

然后:

> grep.custom(test,"sd")
[1] "sd" "sd"
> grep.custom(test,"[0-9]")
[1] "4" "6" "5" "1" "2" "3"
> grep.custom(test,"[a-z]s[a-z]")
[1] "asd" "fsd"

编辑2:

对于向量,使用函数Vectorize(),例如:

> X <- c("sq25dfgj","sqd265jfm","qs55d26fjm" )
> v.grep.custom <- Vectorize(grep.custom)
> v.grep.custom(X,"[0-9]+")
$sq25dfgj
[1] "25"

$sqd265jfm
[1] "265"

$qs55d26fjm
[1] "55" "26"

如果您想从 shell 调用 grep,请参阅 ?system

关于r - 如何在 R 中使用带参数的 grep?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4397876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com