我是R的新手所以我正在努力解决我想象的一个相当简单的问题。对于这个问题,我不是在找人给我一个解决方案。我希望有人可以向我解释答案,这样我就可以自己学习,而不是仅仅复制你所做的事情。话虽如此,这是我的问题和疑问。
我正在用R做直方图。用户将提交一个文件,该文件中的数据将用于制作直方图。已经设定并完成了那么多。我遇到问题的地方是我只需要获取该文件名的一部分并使用它来帮助制作直方图的标题。文件名有点像怪物,遵循这个命名惯例:
X_Y.doc.Z.x_y_z
我需要的文件名方面是Y和Z.我知道很多人都使用grep,但我不知道如何在这个实例中使用它。我已经阅读过grep页面了,熟悉grep的基础知识,但不知道从哪里开始。
最终我还需要从excel文件中获取一些信息,如果有人在这方面也提供建议的话。 如果它有帮助,这就是我接受文件的方式:
F.n<-(tk_choose.files(default="", caption="Select a file", multi=TRUE, filters=NULL, index=1))
有没有人有任何建议?
答案 0 :(得分:3)
使用stringr
给出的答案非常好。该软件包为您提供了一些非常有用的字符串修改工具。
如果您只想使用base,可以使用gsub
执行此操作。假设你的标点符号保持不变,并且X,Y或Z中没有任何嵌入句点或下划线应该可以正常工作
f <- 'X_Y.doc.Z.x_y_z'
gsub('^.+_(.+)\\.doc\\.(.+)\\..+_.+$', '\\1 \\2', f)
返回:
"Y Z"
你可以把你想要的东西放在那里,但是为了让它更容易获得每件作品,或者可以在两行中分别返回一件。请记住,R几乎从不改变数据。您需要将函数的输出分配给如下所示的变量。否则它只会打印到控制台并且会丢失&#34; (这是当时的大多数)。
y <- gsub('^.+_(.+)\\.doc\\..+\\..+_.+$', '\\1', f)
z <- gsub('^.+_.+\\.doc\\.(.+)\\..+_.+$', '\\1', f)
让我们分解。
^
指定一行的开头。很明白。类似地$
标识一行的结尾。
.
表示任何字符,其后跟+
表示任意字符中的一个或多个字符。如果您使用.*
代替.+
,则意味着任何角色零或更多,这不是我们想要的。如果我想写一个普通的.
我需要逃避它,因为它是一个特殊的角色。 \
是正则表达式和R的转义字符。所以...你需要两个。要编写正常句点,您需要编写\\.
清楚可以肯定。最后,括号代表我想要保存的组。稍后可以使用表示您保存它们的顺序的数字来引用它们。在某些语言中,这些括号也需要转义,但不是R。
答案 1 :(得分:2)
Grep使用Regular Expressions来搜索与模式匹配的子字符串。对于从文件名中匹配某些元素的问题,您可能希望使用捕获组来提取不同的部分。
带有捕获组的正则表达式的示例是:
"Hello, (\w+)"
匹配“Hello,Friend”格式的字符串。以下是对模式的解释:
\w
将匹配“字符”,而+
表示至少有一个,但多个匹配。 _
但必须转义.
,因为它们在正则表达式中具有特殊含义。 (\w+)
使用所有这些,我们得到以下模式:
"(\w+)_(\w+)\.doc\.(\w+)\.(\w+)_(\w+)_(\w+)"
要让模式在R中运行,我们必须将所有\
个字符转义为\\
:
> pattern = "(\\w+)_(\\w+)\\.doc\.(\\w+)\\.(\\w+)_(\\w+)_(\\w+)"
虽然grep和regex很强大,但我个人更喜欢stringr包用于其更简单的界面,特别是str_match
函数非常有用,因为它将返回一个矩阵,第1列给出了完整的匹配以及为捕获组提供匹配的所有后续列:
> x = "X_Y.doc.Z.x_y_z"
> str_match(x, pattern)
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] "X_Y.doc.Z.x_y_z" "X" "Y" "Z" "x" "y" "z"
如果您不熟悉正则表达式,那么您应该使用this one等任何语言的教程。语法大致相似,但仅在细节上有所不同,而并非所有编程语言都支持所有功能。如果您想在将表达式放入程序之前先试用它们,我强烈推荐RegexPal
答案 2 :(得分:0)
在这个简单的情况下,只需要一个明确定义的单个字母,substr
可能会更简单:
> a <- "X_Y.doc.Z.x_y_z"
> substr(a, 3, 3)
[1] "Y"
> substr(a, 9, 9)
[1] "Z"