R:用棘手的分隔符将一列分成几行

R: Separate a column into rows with tricky separators

我想将一个包含文本数据的列分成两列,但分隔符管理非常棘手,我相信有一个正则表达式解决方案,但不是很精通它来找到方法。 数据集样本为:

Obs           Message
1       "a : 3 b : 5"
2       "c : 4 a : 2 d : 9"
3       ""
4       "b : 3"

数据块用空格分隔,变量/值用":"分隔

我的尝试:

library (tidyr)
data %>%  separate(Message, sep= " : ", into = c("variable","value"))

>
Obs variable value
1      1        a   3 b
2      2        c   4 a
3      3           <NA>
4      4        b     3

需要额外的步骤,因为消息的可变长度会影响逻辑。

如果有人请看一下,让我知道是否有任何正则表达式(或其他方法)有帮助。 感谢您对此的意见。

编辑:添加预期输出:

Obs Variable Value

1    "a"      3    
1    "b"      5    
2    "c"      4    
2    "a"      2    
2    "d"      9    
3    ""       ""   
4    "b"      3

您可以使用 separate_rows + separate.

library(dplyr)
library(tidyr)

df %>%
  separate_rows(Message, sep = '\s(?=[a-z])') %>%
  separate(Message, c('variable', 'value'), sep = ' : ', fill = 'right', convert = TRUE)

#    Obs variable value
#  <int> <chr>    <int>
#1     1 "a"          3
#2     1 "b"          5
#3     2 "c"          4
#4     2 "a"          2
#5     2 "d"          9
#6     3 ""          NA
#7     4 "b"          3

数据

df <- structure(list(Obs = 1:4, Message = c("a : 3 b : 5", "c : 4 a : 2 d : 9", 
"", "b : 3")), class = "data.frame", row.names = c(NA, -4L))