0

我是 R 新手,所以我正在努力解决我想象的一个相当简单的问题。对于这个问题,我不是在找人给我一个解决方案。我希望有人可以向我解释答案,这样我就可以学会自己做,而不仅仅是复制你所做的。话虽如此,这是我的问题和疑问。

我正在用 R 制作直方图。用户将提交一个文件,该文件中的数据将用于制作直方图。已经设置并完成了很多工作。我遇到的问题是我只需要获取该文件名的一部分并使用它来帮助为直方图制作标题。文件名有点像怪物,并遵循以下命名约定:

X_Y.doc.Z.x_y_z

我需要的那个文件名的方面是 Y 和 Z。我知道很多人使用 grep,但我不知道在这种情况下如何使用它。我已经阅读了 ??grep 页面并且熟悉 grep 的基础知识,但不知道从哪里开始。

最后,我还需要从 excel 文件中 grep 一些信息,如果有人也愿意在这件事上给我建议的话。如果有帮助,这就是我接受文件的方式:

F.n<-(tk_choose.files(default="", caption="Select a file", multi=TRUE, filters=NULL, index=1))

有没有人有什么建议?

4

3 回答 3

3

已经给出的答案stringr非常好。该软件包为您提供了一些非常有用的字符串处理工具。

如果您只想使用 base,您可以使用gsub. 假设您的标点符号保持不变,并且 X、Y 或 Z 中不会有任何嵌入的句点或下划线,这样的东西应该可以工作

f <- 'X_Y.doc.Z.x_y_z'
gsub('^.+_(.+)\\.doc\\.(.+)\\..+_.+$', '\\1 \\2', f)

返回:

"Y Z" 

你可以把你想要的任何东西放在那里,这样更容易拿到每一块,或者可以在两行中执行此操作,每行返回一个。请记住,R 几乎从不更改数据。您需要将函数的输出分配给如下变量。否则它只会打印到控制台并“丢失”(大多数情况下都是如此)。

y <- gsub('^.+_(.+)\\.doc\\..+\\..+_.+$', '\\1', f)
z <- gsub('^.+_.+\\.doc\\.(.+)\\..+_.+$', '\\1', f)

让我们分解一下。

^指定行的开头。明确一点是好的。类似地$标识一行的结尾。

.表示任何字符,并在其后加上+一个或多个任何字符的意思。如果你使用它.*而不是.+它意味着零个或多个任何字符,这不是我们想要的。如果我想写一个普通的.,我需要转义它,因为它是一个特殊字符。 \是正则表达式和 R 的转义字符。所以......你需要两个。要写一个正常的时期,你需要写\\.

清楚地确定。最后,括号代表我要保存的组。稍后可以使用指示您保存它们的顺序的数字来引用它们。在某些语言中,这些括号也需要转义,但 R 不需要。

于 2012-08-16T14:28:42.557 回答
2

Grep 使用正则表达式来搜索匹配模式的子字符串。对于从文件名匹配某些元素的问题,您可能希望使用捕获组来提取不同的部分。

带有捕获组的正则表达式示例如下:

"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" 

如果您不熟悉正则表达式,那么您应该可以使用任何语言的教程,例如这个。语法大多相似,但仅在细节上有所不同,并非所有编程语言都支持所有功能。如果您想在将表达式放入程序之前尝试一下,我强烈推荐RegexPal

于 2012-08-16T14:25:34.153 回答
0

在这种只需要一个位于明确定义的位置的字母的简单情况下,substr可能会更简单:

> a <- "X_Y.doc.Z.x_y_z"
> substr(a, 3, 3)
[1] "Y"
> substr(a, 9, 9)
[1] "Z"
于 2012-08-16T15:01:22.507 回答