2017-10-18 65 views
1

我有一個數據框與一列稱爲標識符包含產品標識符數據作爲一個字符串是一個字典列表。R數據框與字典列表作爲字段

test_data <- data.frame(
    identifiers = c(
    "[{\"type\":\"ISBN\",\"value\":\"9781231027073\"}]", 
    "[{\"type\":\"EAN\",\"value\":\"5055266202847\"},{\"type\":\"EAN\",\"value\":\"4053162095984\"}]"), 
    id = c(1,2), stringsAsFactors = FALSE) 


> test_data 
    identifiers                  id 
1 [{"type":"ISBN","value":"9781231027073"}]          1 
2 [{"type":"EAN","value":"5055266202847"},{"type":"EAN","value":"4053162095984"}] 2 

我想什麼實現的是:

output_test_data <- data.frame(
    type = c("ISBN", "EAN", "EAN"), 
    value = c("9781231027073","5055266202847","4053162095984"), 
    id = c(1,2,2), stringsAsFactors = FALSE) 

> output_test_data 
    type   value id 
1 ISBN 9781231027073 1 
2 EAN 5055266202847 2 
3 EAN 4053162095984 2 

我到了解決方案最接近的是從jsonlite應用fomJSON功能。

jsonlite::fromJSON(test_data$identifiers[1]) 

或用這樣的循環:

for (i in test_data$identifiers) { 
    print(jsonlite::fromJSON(i)) 
} 

但是我很努力:

1)把它應用到所有行。 2)將原始數據的id信息保存到結果中。

任何人都可以幫忙嗎?

+0

退房'lapply'(https://www.rdocumentation.org/packages/base/versions/3.4.1/topics/lapply)的功能,適用於多個值 –

回答

1

你可以這樣做:

df_result <- apply(test_data,1,function(x){ 
    id_tmp <- x[2] 

    df_out <- jsonlite::fromJSON(x[1]) 
    df_out$id <- id_tmp 
    return(df_out) 
}) 
df_result <- do.call("rbind",df_result) 
+0

小但重要的細節:)你也沒有提到你正在從json文件讀取,在你的例子中你的數據存儲在'data.frame'中。 'id'從哪裏來,這是否也存儲在數據文件中,或者它只是文件中的rownumber? –

+0

我不是從json文件讀取數據,而是從包含文本字段的mysql表中讀取數據。我正在運行您的解決方案,謝謝! –

+0

很高興幫助!從MySQL表中讀取數據塊(例如每塊100k行)並將解決方案應用到塊可能會大大提高性能,與在22M行上運行相比。 –