2017-10-18 6 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行で実行する場合と比べてパフォーマンスが大幅に向上する可能性があります。 –

関連する問題