首页 > 解决方案 > 如何将字符串转换为R中的嵌套列表?

问题描述

我有一个数据框,列中有嵌套列表。由于它是从 csv 读取的,因此列被格式化为字符。

用于复制的虚拟数据:

col1 <- c("list1", 
          "list2",
          "emptylist",
          "list3")
col2 <-c("[{'test': 1, 'test2': 2, 'test3': 'string'}, {'test': 1, 'test2': 2, 'test3': 'string2'}]", 
         "[{'test3': 5, 'test4': 6, 'test5': 'string3'}, {'test': 7, 'test6': 8, 'test7': 'string4'}]",
         "",
         "[{'test9': 9, 'test10': 10, 'test11': 'string11'}, {'test12': 12, 'test13': 13, 'test14': 'string14'}]")
mydf <- data.frame(col1, col2)

为了使用类似的东西mydf %>% dplyr::unnest(col2),我首先需要将列从字符格式化为列表。这是否可能,如果没有,可以使用什么替代解决方案?

标签: rlistdataframedplyrnested-lists

解决方案


fromJSON使用from可能更容易jsonlite

library(jsonlite)
lapply(gsub("'", '"', mydf$col2), fromJSON)
[[1]]
  test test2   test3
1    1     2  string
2    1     2 string2

[[2]]
  test3 test4   test5 test test6   test7
1     5     6 string3   NA    NA    <NA>
2    NA    NA    <NA>    7     8 string4

使用新数据集,只需将不为空的数据集子集为!=ornzchar

i1 <- nzchar(mydf$col2)
mydf$col3[i1] <- lapply(gsub("'", '"', mydf$col2[i1]), fromJSON)

-输出

> mydf$col3
[[1]]
  test test2   test3
1    1     2  string
2    1     2 string2

[[2]]
  test3 test4   test5 test test6   test7
1     5     6 string3   NA    NA    <NA>
2    NA    NA    <NA>    7     8 string4

[[3]]
NULL

[[4]]
  test9 test10   test11 test12 test13   test14
1     9     10 string11     NA     NA     <NA>
2    NA     NA     <NA>     12     13 string14

推荐阅读