在 R 中拆分列表中的内容

splitting the contents in the list in R

我在列表中有以下内容

"[4]  {PIVOTAL GEMFIRE}                             => {HIBERNATE}                    0.005952381 1.0000000  168.000000 2    \r"

我需要将其获取为:

 4,{PIVOTAL GEMFIRE},{HIBERNATE},0.005952381,1.0000000,168.000000,2

我需要将它按行放置在数据框中

将每个 =>[] 替换为给出 s1 的空字符串,然后替换任何数字或 } 后跟 space 相同的数字或 } 后跟一个逗号。然后使用逗号作为分隔符阅读它。如果内容中可以出现逗号,则使用不同的分隔符。

s1 <- gsub("=>|[][]", "", DF$x)
s2 <- gsub("([0-9}]) ", "\1,", s1)
read.table(text = s2, as.is = TRUE, strip.white = TRUE, sep = ",")[-8]

给予:

  V1                V2          V3          V4 V5  V6 V7
1  4 {PIVOTAL GEMFIRE} {HIBERNATE} 0.005952381  1 168  2
2  4 {PIVOTAL GEMFIRE} {HIBERNATE} 0.005952381  1 168  2

备注

使用的测试数据:

x <- "[4]  {PIVOTAL GEMFIRE}                             => {HIBERNATE}                    0.005952381 1.0000000  168.000000 2    \r"
DF <- data.frame(x = c(x, x), stringsAsFactors = FALSE)

编辑: 添加缺失的 }.

你可以这样做(string 是你的字符串):

gsub("((\S+)|(\{[^{}]+\}))\s", "\1,", trimws(gsub("[^[:alnum:].{}]+", " ", string)))

解释:

  • gsub("[^[:alnum:].{}]+", " ", string):用 space
  • 替换所有不是字母数字字符或大括号或点(并且可以出现多次)的内容
  • trimws(...):从刚刚得到的修改后的字符串中删除前导和尾随 spaces
  • gsub("((\S+)|(\{[^{}]+\}))\s", "\1",...):在前一个结果中,捕获 space 之前的所有内容,并由非 space 或大括号之间的任何内容组成,并在后面加上逗号。

然后您可以使用 read.table 读取向量,使用 sep="," 放入 data.frame

测试:

string <- "[4]  {PIVOTAL GEMFIRE}                             => {HIBERNATE}                    0.005952381 1.0000000  168.000000 2    \r"

read.table(text=gsub("((\S+)|(\{[^{}]+\}))\s", "\1,", trimws(gsub("[^[:alnum:].{}]+", " ", string))), sep=",")

#  V1                V2          V3          V4 V5  V6 V7
#1  4 {PIVOTAL GEMFIRE} {HIBERNATE} 0.005952381  1 168  2