如果字符串包含某些字符,则过滤和子集(在 R 中)

8 string r subset filter

我目前希望将数据帧划分为用于训练/测试的子集。在数据框中,有些列包含不同的项目,有些列包含子项目,如(Aisle01、Aisle02 等)。我因过滤掉多列中的部分字符串而被绊倒。

数据样本:

Column1   Column2  Column3

Wall01    Wall04   45.6
Wall04    Aisle02  65.7
Aisle06   Wall01   45.0
Aisle01   Wall01   33.3
Wall01    Wall04   21.1
Run Code Online (Sandbox Code Playgroud)

如果我的数据框 (x) 包含两列,其中包含多个版本的“Aisle”,我希望从包含“Aisle”的两列中过滤掉所有内容。想知道下面的线路是否在正确的轨道上?

filter(x, column1 & column2 == grep(x$column1 & x$column2, "Aisle"))

想要的结果:

Column1  Column2  Column3

Wall04   Aisle02  65.7
Aisle06  Wall01   45.0
Aisle01  Wall01   33.3
Run Code Online (Sandbox Code Playgroud)

先感谢您。

Bar*_*ker 7

我能看到的最简单的解决方案是:

x <- x[grepl("Aisle", x[["column1"]]) | grepl("Aisle", x[["column2"]]), ]
Run Code Online (Sandbox Code Playgroud)

使用grepl而不是grep产生逻辑,因此您可以使用该|操作来选择您的行。另外,我只是想快速检查一下您的代码中可能给您带来麻烦的几个地方。

  1. x$column1 & x$column2你的开头grep声明意味着该函数将尝试运行&在每个条目的操作成对的column1column2。由于这些是字符而不是逻辑,这会产生一些奇怪的结果。

  2. greppattern你试图匹配而来的字符串,然后试图匹配到,所以应该grep("Aisle", columnValue)不是周围的其他方式。运行?functionName将为您提供有关该函数的信息,因此您不必尝试从记忆中找出它。

  3. filter是时间序列 ( ts) 对象的函数,而不是数据帧。我很惊讶您以这种方式使用它没有出错。

祝你好运。如果您想澄清任何事情,请发表评论。