在 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
我在列表中有以下内容
"[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(...)
:从刚刚得到的修改后的字符串中删除前导和尾随 spacesgsub("((\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