【问题标题】:splitting the contents in the list in R在R中拆分列表中的内容
【发布时间】:2018-07-23 21:20:00
【问题描述】:

我在列表中有以下内容

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

我需要得到它:

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

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

【问题讨论】:

  • 您好,欢迎您!请解释您做了什么以及得到了什么(以便我们了解您的问题并尝试帮助解决它)。我们不是免费的开发中心:P(但我会说要回答尝试使用像([^\s]+)\s*这样的正则表达式来获取输出(在某些语言中类似于列表),然后将逗号添加到单独的值中)
  • 当我尝试使用正则表达式时(当我使用空格分隔时),它就像 {PIVOTAL 和 GEMFIRE} 作为两个单独的值,但我希望它作为 {PIVOTAL GEMFIRE}
  • 不要用文字解释你做了什么,而是将确切的代码添加到问题中。

标签: r regex strsplit


【解决方案1】:

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

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

说明:

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

然后你可以用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

【讨论】:

  • 保留“\\1”的目的是什么,是gsub
  • @EllantiKishore \\1 是将捕获的内容(在正则表达式的括号中)放入结果中。因此,您捕获要用逗号替换的空格之前的内容,然后将其放入结果中,然后是逗号。
【解决方案2】:

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

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)

编辑:添加了缺失的}。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2021-09-26
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多