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

问题描述

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

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