我試圖「自動」將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