2017-07-12 204 views
0

我遇到了找到正确的正则表达式以将单列分隔为两列的麻烦。使用正则表达式分隔列

这是我的例子。

Col 1 
8.3 algo y algo mas 

我想这

Col 1 Col 2 
8.3  algo y algo mas 

我一直在尝试此代码。

library(tidyverse) 
    base <- base %>% 
separate(col 1, into c("col 2", "col 3"), sep = "\\s") 
+0

因此,您的整个前提取决于第1列是非空白值,第2列是剩余的吗? – sln

+0

您需要“进入”以获取与分隔字符串一样多的名称。如果你使用“\\ s”,它会将它分成5而不是2. – Kevin

+0

如果你确定列之间会有3个或更多的空格,试试'sep =“\\ s {3,}”'。根据需要调整值。 –

回答

0

为了安全起见,我认为这是最好的一个容易识别的字符数后替换每一个空间......

df[, 'Col 1'] <- gsub(pattern = '^([0-9\\.]+) ', replacement = '\\1_', x = df[, 'Col 1'])

然后我会用separate

df <- separate(data = df, col = 'Col 1', into = c('Col 1', 'Col 2'), sep = '_')

我也会改变列名,因为空间通常是一个问题,当我列名称...尝试改为col_1之类的内容。

+0

谢谢你的回答,但是,有一个问题,当我运行你的代码时,colums将第一个数字分开。可能是我运行错了你的代码。我在这个环境中非常新。 –

+0

是的,我应该注意到,作为分隔符的点不会很好,因为你已经有了原始数据中的点。我改变了分隔符,请让我知道如果这现在适合你。 –

0

您可以从stringrrebus尝试的功能:

df <- data.frame(Col_1 = "8.3 algo y algo mas") 

library(stringr) 
library(rebus) 
str_match(df$Col_1, pattern = capture(DGT %R% DOT %R% DGT) %R% 
           SPC %R% 
           capture(one_or_more(or(SPC, LOWER)))) 

rebus包允许您使用人类可读的代码来构建一块正则表达式件。输出结果如下:

#  [,1]     [,2] [,3]    
# [1,] "8.3 algo y algo mas" "8.3" "algo y algo mas" 
+0

谢谢你的回答,这非常有帮助 –