【问题标题】:Separate columns with regular expressions用正则表达式分隔列
【发布时间】:2017-07-12 00:15:23
【问题描述】:

我很难找到正确的正则表达式来将一列分成两列。

这是我的例子。

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

【问题讨论】:

  • 所以你的整个前提取决于第 1 列是非空白值,而第 2 列是其余的?
  • 您需要 "into" 具有与分隔字符串一样多的名称。如果您使用“\\s”,它会将其拆分为 5 而不是 2。
  • 如果您确定列之间会有 3 个或更多空格,请尝试 sep="\\s{3,}"。根据需要调整值。

标签: r regex database dataframe tidyverse


【解决方案1】:

为了安全起见,我认为最好将数字后的每个空格替换为易于识别的字符...

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

那我就用separate:

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

我也会更改列名,因为在列名中空格通常是个问题...尝试更改为 col_1 之类的名称。

【讨论】:

  • 感谢您的回答,但是有一个问题,当我运行您的代码时,列将点前的第一个数字分开。可能是我跑错了你的代码。我是这个 R 环境的新手。
  • 是的,我应该注意到作为分隔符的点不是很好,因为原始数据中已经有了点。我更改了分隔符,如果现在适合您,请告诉我。
【解决方案2】:

你可以试试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"

【讨论】:

  • 感谢您的回答,非常有帮助
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
相关资源
最近更新 更多