另一个问题的答案解释了how to match a string not containing a word。
问题(对我来说)是给出的解决方案在R中不起作用。
我经常从现有的向量创建data.frame()
,并希望清理我的工作区。例如,如果我的工作区包含:
> ls()
[1] "A" "B" "dat" "V"
>
我想只保留dat
,我必须用以下方法清理它:
> rm(list=ls(pattern="A"))
> rm(list=ls(pattern="B"))
> rm(list=ls(pattern="V"))
> ls()
[1] "dat"
>
(其中A
,B
和V
只是my.first.vector
等大量复杂名称的示例,不容易与{{1}匹配})。
告诉rm(list=ls(pattern="[ABV]"))
移除除rm()
之外的所有内容最方便(对我来说),但问题是链接的问答中给出的解决方案不起作用:
dat
那么 我如何匹配除R中的> rm(list=ls(pattern="^((?!dat).)*$"))
Error in grep(pattern, all.names, value = TRUE) :
invalid regular expression '^((?!dat).)*$', reason 'Invalid regexp'
>
以外的所有内容?
答案 0 :(得分:4)
Negative look-around
需要perl=TRUE
参数。因此,您将无法直接将ls(pattern = ...)
与正则表达式一起使用。或者你可以这样做:
rm(list = grep("^((?!dat).)*$", ls(), perl=TRUE, value=TRUE))
如果您正在寻找不准确的比赛。如果你正在寻找完全匹配,你应该做Ferdinand所评论的:
rm(list=ls()[ls() != "dat"])
答案 1 :(得分:4)
这将删除除dat
以外的所有对象。 (如果要删除名称以点开头的对象,请使用ls
参数all.names = TRUE
。)
rm( list = setdiff( ls(), "dat" ) )
将"dat"
替换为名称向量,例如c("dat", "some.other.object")
,如果你想保留几个对象;或者,如果几个对象都可以通过正则表达式轻松匹配,请尝试这样的方法,删除名称不以"dat"
开头的所有对象:
rm( list = setdiff( ls(), ls( pattern = "^dat" ) ) )
另一种方法是保存数据save("dat", file = "dat.RData")
,退出R,启动新的R会话并加载数据1oad("dat.RData")
。另请注意重新启动R的<{3}}