【问题标题】:Regular expression on separate function of TidyrTidyr单独函数的正则表达式
【发布时间】:2016-05-15 15:45:00
【问题描述】:

我需要用 tidyr 分开两列。

该列的文本如下:I am Sam。我的意思是文本总是只有两个空格,文本可以有所有其他符号:[a-z][0-9][!\ºª, etc...]

问题是我需要将它分成两列:第一列I am,第二列:Sam

我找不到与第二个空格分开的正则表达式。

你能帮帮我吗?

【问题讨论】:

标签: r tidyr


【解决方案1】:

我们可以从tidyr 使用extract。我们匹配一个或多个字符并将其放入一个捕获组 ((.*)) 后跟一个或多个空格 (\\s+) 和另一个仅包含非空白字符 (\\S+) 的捕获组以分隔原始一列分成两列。

library(tidyr)
extract(df1, Col1, into = c("Col1", "Col2"), "(.*)\\s+(\\S+)")
#   Col1 Col2
#1  I am  Sam
#2 He is  Sam

数据

df1 <- data.frame(Col1 = c("I am Sam", "He is Sam"), stringsAsFactors=FALSE)

【讨论】:

  • 很好的答案,但您应该解释正则表达式的作用,以便 OP 可以理解。
【解决方案2】:

作为替代,给定:

library(tidyr)
df <- data.frame(txt = "I am Sam")

你可以使用

separate(, txt, c("a", "b"), sep="(?<=\\s\\S{1,100})\\s") 
#      a   b
# 1 I am Sam

separate 使用 stringi::stri_split_regex(ICU 引擎),或

separate(df, txt, c("a", "b"), sep="^.*?\\s(*SKIP)(*FAIL)|\\s", perl=TRUE) 

与旧的 (?) separate 一起使用 base:strsplit(Perl 引擎)。另请参阅

strsplit("I am Sam", "^.*?\\s(*SKIP)(*FAIL)|\\s", perl=TRUE)
# [[1]]
# [1] "I am" "Sam" 

但这可能有点“深奥”……

【讨论】:

    猜你喜欢
    • 2016-09-09
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多