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

标签 r string reshape tidyr

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

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

数据 block 之间用空格分隔,变量/值之间用“:”分隔

我尝试这样做:

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

关于R:使用棘手的分隔符将列分成行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67994981/

相关文章:

c# - Python在C#中的unpack函数

r - 将重复的列集收集到单个列中

python - pandas 将多键值数据帧列 reshape 为行

r - 在基本图形的绘图区域之外绘制图例?

r - ggplot2:将多变量facet_wrap标签放在一行上

c++ - 字符串与整数的连接

string - 获取标准输入并将其作为字符串存储在 lisp 中

python - reshape 数据框并聚合值

string - 从R中的字符串中删除html标签

r - 如何降低 gridExtra 的 grid.arrange 中的主标题?