如何将字符串转换为 R 中的嵌套列表?
How to convert strings into nested lists in 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)
的东西,我首先需要将列从字符格式化为列表。这是否可能,如果不可能,可以使用什么替代解决方案?
使用 jsonlite
中的 fromJSON
可能更容易
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
对于新数据集,只需将不为空的数据集子集化为 !=
或 nzchar
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
我有一个在列中包含嵌套列表的数据框。由于它是从 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)
的东西,我首先需要将列从字符格式化为列表。这是否可能,如果不可能,可以使用什么替代解决方案?
使用 jsonlite
fromJSON
可能更容易
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
对于新数据集,只需将不为空的数据集子集化为 !=
或 nzchar
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