将用chars编写的python列表读入r

nc1teljy  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(265)

我在r中加载了一个数组,每个位置都包含一个python列表,该列表以字符串的形式存储,例如我的第一个位置 tmp 数组为 "[(1,2),(3,4),(5,6)]" .
我怎样才能把数据解释成r来得到一个向量,这个向量在每个位置都包含上述列表?

zf9nrax1

zf9nrax11#

我认为到目前为止更好的方法(正如@sirius所建议的)是使用更可移植的格式(比如json)从python导出。
缺少这些,如果总是python列表和元组,那么您可以 gsub 这个 ()[] 并将其解析为json:

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(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),加上控制简化:

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
dphi5xsq

dphi5xsq2#

它是嵌套的 listR . 一个选择是 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

相关问题