2017-10-18 60 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行上运行相比。 –