2016-10-02 6 views
0

JSONを3列のdata.frameに正しく変換しようとしています。JSONを2列以上のdata.frameに変換する

これは私がこれはdata.frame

# my solution 
my_data <- data.frame(fruit = do.call(c, my_data), 
    bag_number = rep(1:length(my_data), 
    sapply(my_data, length))) 

# how it looks 
my_data 

> my_data 
     fruit bag_number 
Bag 11 bananas   1 
Bag 12 oranges   1 
Bag 13  1   1 
Bag 14  2   1 
Bag 21 bananas   2 
Bag 22 oranges   2 
Bag 23 apples   2 
Bag 24  3   2 
Bag 25  4   2 
Bag 26  5   2 
を作成するために、私の解決策である

# this return an error about "arguments imply differing number of rows: 2, 3" 
my_data <- as.data.frame(my_data) 

> my_data <- as.data.frame(my_data) 
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : 
    arguments imply differing number of rows: 2, 3 

data.frameにそれを変換しようとする私のデータの簡素化

# simplification of my real data 
my_data <- '{"Bag 1": [["bananas", 1], ["oranges", 2]],"Bag 2": [["bananas", 3], ["oranges", 4], ["apples", 5]]}' 

library(jsonlite) 

my_data <- fromJSON(my_data) 

> my_data 
$`Bag 1` 
    [,1]  [,2] 
[1,] "bananas" "1" 
[2,] "oranges" "2" 

$`Bag 2` 
    [,1]  [,2] 
[1,] "bananas" "3" 
[2,] "oranges" "4" 
[3,] "apples" "5" 

です

しかし私の考えは、私がしたいときにmy_data[a:b,1]をやっているような問題を避けるために、こういうものを得ることです。 ggplot2などを使用します。/tidyverseバージョン

fruit | quantity | bag_number 
oranges | 2  | 1 
bananas | 1  | 1 
oranges | 4  | 2 
bananas | 3  | 2 
apples | 5  | 2 
+0

サンプルデータセットでは初期出力が生成されません。代わりに、リストのネストされたリストを生成します。リストのリストは非常に扱いにくいものです。私は 'rjson :: fromJSON'を使用しています。 – jdobres

+0

ありがとう、はい、今変更しました – pachamaltese

答えて

2
library(plyr) 

# import data (note that the rJSON package does this differently than the jsonlite package) 
data.import <- jsonlite::fromJSON(my_data) 

# combine all data using plyr 
df <- ldply(data.import, rbind) 

# clean up column names 
colnames(df) <- c('bag_number', 'fruit', 'quantity') 

    bag_number fruit quantity 
1  Bag 1 bananas  1 
2  Bag 1 oranges  2 
3  Bag 2 bananas  3 
4  Bag 2 oranges  4 
5  Bag 2 apples  5 
+0

jsonliteとrJSONは同じことをしていますが、実際は違っています。どうもありがとう。 – pachamaltese

2

purrr。また、適切な型を取得して「Bag」を削除します。

library(jsonlite) 
library(purrr) 
library(readr) 

fromJSON(my_data, flatten=TRUE) %>% 
    map_df(~as.data.frame(., stringsAsFactors=FALSE), .id="bag") %>% 
    type_convert() %>% 
    setNames(c("bag_number", "fruit", "quantity")) -> df 

df$bag_number <- gsub("Bag ", "", df$bag_number) 
+0

ありがとうございました。 '' purr''も役立ちます。 – pachamaltese

関連する問題