我在r中加载了一个数组,每个位置都包含一个python列表,该列表以字符串的形式存储,例如我的第一个位置 tmp 数组为 "[(1,2),(3,4),(5,6)]" .我怎样才能把数据解释成r来得到一个向量,这个向量在每个位置都包含上述列表?
tmp
"[(1,2),(3,4),(5,6)]"
zf9nrax11#
我认为到目前为止更好的方法(正如@sirius所建议的)是使用更可移植的格式(比如json)从python导出。缺少这些,如果总是python列表和元组,那么您可以 gsub 这个 () 至 [] 并将其解析为json:
gsub
()
[]
tr <- function(x, from="()", to="[]") { chrs <- Map(c, strsplit(from, "")[[1]], strsplit(to, "")[[1]]) Reduce(function(txt, chr) gsub(chr[1], chr[2], txt, fixed = TRUE), chrs, init = x) } tr("[(1,2),(3,4),(5,6)]") # [1] "[[1,2],[3,4],[5,6]]" jsonlite::parse_json(tr("[(1,2),(3,4),(5,6)]")) # [[1]] # [[1]][[1]] # [1] 1 # [[1]][[2]] # [1] 2 # [[2]] # [[2]][[1]] # [1] 3 # [[2]][[2]] # [1] 4 # [[3]] # [[3]][[1]] # [1] 5 # [[3]][[2]] # [1] 6
这个 tr 函数也适用于字符串向量:
tr
tr(c("[(1,2),(3,4),(5,6)]", "[(1,2),(3,4),(5,7)]")) # [1] "[[1,2],[3,4],[5,6]]" "[[1,2],[3,4],[5,7]]"
但是使用 jsonlite:: 为此,您需要 stream_in 相反,从技术上讲,它将是ndjson( n ewline公司- d elimited),加上控制简化:
jsonlite::
stream_in
n
d
vec <- c("[(1,2),(3,4),(5,6)]", "[(1,2),(3,4),(5,7)]") tr(vec) # [1] "[[1,2],[3,4],[5,6]]" "[[1,2],[3,4],[5,7]]" out <- jsonlite::stream_in(textConnection(tr(vec)), simplifyVector = FALSE) # Imported 2 records. Simplifying... str(out) # List of 2 # $ :List of 3 # ..$ :List of 2 # .. ..$ : int 1 # .. ..$ : int 2 # ..$ :List of 2 # .. ..$ : int 3 # .. ..$ : int 4 # ..$ :List of 2 # .. ..$ : int 5 # .. ..$ : int 6 # $ :List of 3 # ..$ :List of 2 # .. ..$ : int 1 # .. ..$ : int 2 # ..$ :List of 2 # .. ..$ : int 3 # .. ..$ : int 4 # ..$ :List of 2 # .. ..$ : int 5 # .. ..$ : int 7
dphi5xsq2#
它是嵌套的 list 在 R . 一个选择是 reticulate ```library(reticulate)tmp <- "[(1,2),(3,4),(5,6)]"py_run_string(paste0('out=', tmp))$out
list
R
reticulate
-输出
2条答案
按热度按时间zf9nrax11#
我认为到目前为止更好的方法(正如@sirius所建议的)是使用更可移植的格式(比如json)从python导出。
缺少这些,如果总是python列表和元组,那么您可以
gsub
这个()
至[]
并将其解析为json:这个
tr
函数也适用于字符串向量:但是使用
jsonlite::
为此,您需要stream_in
相反,从技术上讲,它将是ndjson(n
ewline公司-d
elimited),加上控制简化:dphi5xsq2#
它是嵌套的
list
在R
. 一个选择是reticulate
```library(reticulate)
tmp <- "[(1,2),(3,4),(5,6)]"
py_run_string(paste0('out=', tmp))$out
1
11
[1] 1
12
[1] 2
2
21
[1] 3
22
[1] 4
3
31
[1] 5
32
[1] 6