显然,我没有得到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
Run Code Online (Sandbox Code Playgroud)
R中缺少的参数是什么?
编辑:Joris Meys的建议非常接近我想要做的事情.我得到一个矢量作为readLines的结果.我想检查向量的每个元素是否有数字并返回这些数字.我真的很惊讶没有标准的解决方案.我想过使用一些可以在字符串上运行的regexp函数并像grep -o一样返回匹配,然后在该向量上使用lapply.grep.custom最接近 - 我会尽力为我工作.
这是因为R的'grep'适用于向量 - 它将对每个元素进行搜索并返回匹配的元素索引.它说'这个矢量中的哪些元素符合这个模式?' 例如,在这里我们制作一个3的向量,然后问'这个向量中哪些元素中有一个数字?'
> test = c("fasdjlk465öfsdj123","nonumbers","123")
> grep("[0-9]",test)
[1] 1 3
Run Code Online (Sandbox Code Playgroud)
元素1和3 - 不是2,只是字符.
你可能想要gsub - 替换任何与数字不匹配的东西:
> gsub("[^0-9]","",test)
[1] "465123" "" "123"
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
编辑:
正如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])})
}
Run Code Online (Sandbox Code Playgroud)
然后 :
> 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"
Run Code Online (Sandbox Code Playgroud)
编辑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"
Run Code Online (Sandbox Code Playgroud)
如果你想从shell调用grep,请参阅 ?system
| 归档时间: |
|
| 查看次数: |
6063 次 |
| 最近记录: |