2016-10-02 23 views
0

我想正確地將JSON轉換爲具有3列的data.frame。將JSON轉換爲多於2列的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" 

我試圖將其轉換爲data.frame

# 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

# 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 

但我的想法是獲得這樣的東西,以避免像我想要做my_data[a:b,1]時使用ggplot2等。

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/tidyverse版本。你也得到適當的類型,並刪除「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

非常感謝。 'purrr'也有幫助。 – pachamaltese