我怎么在R?

Dav*_*uer 24 grep r subset

例如,我想根据名称的子集选择行

如果我有以下数据:

data <- structure(c(91, 92, 108, 104, 87, 91, 91, 97, 81, 98), 
.Names = c("fee-", "fi", "fo-", "fum-", "foo-", "foo1234-", "123foo-", 
"fum-", "fum-", "fum-"))
Run Code Online (Sandbox Code Playgroud)

如何选择匹配'foo'的行?

使用grep()不起作用:

 grep('foo', data)
Run Code Online (Sandbox Code Playgroud)

收益:

integer(0)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?或者,还有更好的方法?

谢谢!

Ale*_*own 27

您需要grep数据的names属性,而不是values属性.

对于您的示例,请使用

> grep("foo",names(data))
[1] 5 6 7
> data[grep("foo",names(data))]
  foo- foo1234-  123foo- 
  87       91       91 
Run Code Online (Sandbox Code Playgroud)

另一种干净的方法是使用数据框.

> data <- data.frame(values=c(91, 92, 108, 104, 87, 91, 91, 97, 81, 98), 
                   names = c("fee-", "fi", "fo-", "fum-", "foo-", "foo1234-", "123foo-", 
                   "fum-", "fum-", "fum-"))

> data$values[grep("foo",data$names)]
[1] 87 91 91
Run Code Online (Sandbox Code Playgroud)


Phi*_*lip 6

将子集与正则表达式结合使用:

subset(your_data, regexpr("foo", your_data$your_column_to_match) > 0))
Run Code Online (Sandbox Code Playgroud)

如果您只关心具有一列的数据集,我猜您不需要指定列名...

菲利普

  • 我经常发现`grepl`在这里更有用 - 你可以跳过比较vs 0,这使得代码看起来更清晰. (6认同)