解析由非字母字符分隔的列中的变量

时间:2018-06-21 16:33:56

标签: r rstudio

我有一列,其中包含以“ /”或“-”分隔的变量。 单元格的示例如下所示:

|Column 1|
|x-a/b-x-a|

使用R,我只想保留变量的第一个实例。输出如下:

|Column1|
|x-a/b|

我需要变量的第一个实例,因为“ /”和“-”表示不同的事物。同样,如果这使得在一个特定的单元格中更简单,那么只能有一个变量实例。因此,在上面的示例中,只有1 x,a和b。

在此问题上的任何帮助将不胜感激。 谢谢。 这是创建可重现示例的代码:

data_frame(x = c(('x-a/b-x-a'),('d/w-a-a-a'), ('b-c/d-b-c/d')))

这是创建我希望输出看起来像的代码:

data_frame(x = c(('x-a/b'),('d/w-a'), ('b-c/d')))

1 个答案:

答案 0 :(得分:0)

下面的代码将使用正则表达式完全满足您的要求,但只有在您想要的是首个由/或-分隔的三个字母的情况下,它才能正常工作。对此的任何偏离都将破坏该特定解决方案,但是您可以使用正则表达式来适应其他情况。

我随意添加第二个向量来说明如何处理具有多列的data.frame。

d <- data.frame( x = c ( ( 'x-a/b-x-a' ), ( 'd/w-a-a-a' ), ( 'b-c/d-b-c/d' ) ), y = c ( ( 'x-a/b-x-a' ), ( 'd/w-a-a-a' ), ( 'b-c/d-b-c/d' ) ) )
out <- as.data.frame(
    lapply( d, function( v ) {
        sub( "([a-z][-/][a-z][-/][a-z]).*", "\\1", v )
    } ) 
)
out
      x     y
1 x-a/b x-a/b
2 d/w-a d/w-a
3 b-c/d b-c/d

相同的功能安排(sub内的lapply)可用于使用不同正则表达式的其他转换,例如[a-z]+[/-][a-z]+[/-][a-z]+等。

如果您想使用更简洁的语法,则还可以使用dplyr和magrittr的管道运算符来获得相同的结果,而无需套用:

require( magrittr )
require( dplyr )
out <- d %>% mutate(
    x = sub( "([a-z][-/][a-z][-/][a-z]).*", "\\1", x ),
    y = sub( "([a-z][-/][a-z][-/][a-z]).*", "\\1", y )
)