我试图“自动”将data.frame列转换为多列。将类似Python的列表转换为R嵌套向量
这里的DF的样子:
library(dplyr)
foo <- data_frame(ID = c(1,2),
Val = c("A", "B"),
Geom = c("[{X11,Y11,Z11}, {X12,Y12,Z12}, {X13,Y13,Z13}]", "[{X21,Y21,Z21},{X22,Y22,Z22},{X23,Y23,Z23}]"))
这是我想它是什么样子:
bar <- data_frame(ID = c(1,1,1,2,2,2),
Val=c("A", "A", "A", "B", "B", "B"),
Geom1 = c("X11", "X12", "X13", "X21", "X22", "X23"),
Geom2 = c("Y11", "Y12", "Y13", "Y21", "Y22", "Y23"),
Geom3 = c("Z11", "Z12", "Z13", "Z21", "Z22", "Z23"))
我认为这种转变工作流由两个部分组成:
1 - 将Geom转换为R结构,如:
list(c("X11","Y11","Z11"), c(...), ...)
2 - 使用tidyr::unnest()
或tidyr::separate()
这样的列表分裂,我觉得我能处理的第二部分列
,但无法找到的第一个良好的指针。我可以将这个列写入一个csv并在之后自动读取,但考虑到我的data.frame将是一个闪亮的反应对象,这将涉及大量的写/读。
我试着用fromJSON()
(jsonlite,rjson和RJSONIO),但是因为这是无效的json-string,所以它不解析它。
@wildintellect告诉我,fromJSON用[]当更换{}工作。我会测试那些各种解决方案,并基准那些,考虑我更喜欢使用管道的临时变量:) – RobinCura
如果你喜欢管道,你可以重写上校的答案像'setDT(foo)[,Geom%>%gsub(pattern = '\\ [{|} \\'',replacement ='',perl = TRUE)%>%strsplit(split ='},* {',perl = T),。(ID,Val)]'或类似在dplyrish。 – Frank
没有像这样的分割栈形: 'setDT(foo)[,strsplit(gsub('\\ [{|} \\]','',Geom,perl = T),'},* {',perl = T),。(ID,Val)]%>% mutate(UID = id)分离(V1,转入= c(“X”,“Y”,“Z”),convert = (列表(ID,Val)))' – RobinCura