2013-03-04 10 views
6

मेरे पास एक डेटाफ्रेम है जिसे मैं नेस्टेड सूची में घोंसला के कस्टम स्तर के साथ कनवर्ट करना चाहता हूं। यह कैसे मैं यह कर रहा है, लेकिन मुझे यकीन है कि वहाँ एक बेहतर तरीका है कर रहा हूँ:डेटाफ्रेम को नेस्टेड सूची में कैसे परिवर्तित करें?

data <- data.frame(city=c("A", "A", "B", "B"), street=c("a", "b", "a", "b"), tenant=c("Smith","Jones","Smith","Jones"), income=c(100,200,300,400)) 

nested_data <- lapply(levels(data$city), function(city){ 
    data_city <- subset(data[data$city == city, ], select=-city) 
    list(city = city, street_values=lapply(levels(data_city$street), function(street){ 
     data_city_street <- subset(data_city[data_city$street == street, ], select=-street) 
     tenant_values <- apply(data_city_street, 1, function(income_tenant){ 
      income_tenant <- as.list(income_tenant) 
      list(tenant=income_tenant$tenant, income=income_tenant$income) 
     }) 
     names(tenant_values) <- NULL 
     list(street=street, tenant_values=tenant_values) 
    })) 
}) 

JSON में उत्पादन की तरह दिखता है:

library(rjson) 
write(toJSON(nested_data), "") 
[{"city":"A","street_values":[{"street":"a","tenant_values":[{"tenant":"Smith","income":"100"}]},{"street":"b","tenant_values":[{"tenant":"Jones","income":"200"}]}]},{"city":"B","street_values":[{"street":"a","tenant_values":[{"tenant":"Smith","income":"300"}]},{"street":"b","tenant_values":[{"tenant":"Jones","income":"400"}]}]}] 

# or prettified: 

[ 
    { 
    "city": "A", 
    "street_values": [ 
     { 
     "street": "a", 
     "tenant_values": [ 
      { 
      "tenant": "Smith", 
      "income": "100" 
      } 
     ] 
     }, 
     { 
     "street": "b", 
     "tenant_values": [ 
      { 
      "tenant": "Jones", 
      "income": "200" 
      } 
     ] 
     } 
    ] 
    }, 
    { 
    "city": "B", 
    "street_values": [ 
     { 
     "street": "a", 
     "tenant_values": [ 
      { 
      "tenant": "Smith", 
      "income": "300" 
      } 
     ] 
     }, 
     { 
     "street": "b", 
     "tenant_values": [ 
      { 
      "tenant": "Jones", 
      "income": "400" 
      } 
     ] 
     } 
    ] 
    } 
] 

वहाँ यह करने के लिए एक बेहतर तरीका है?

+0

तो, आप 'के बारे में अनुसंधान से JSON' उत्पादन एक सवाल पूछ रहे हैं, या कैसे एक' R' वस्तु है जो एक है बनाने के लिए आर की परिभाषा में "नेस्टेड सूची", उदाहरण के लिए 'foo <-list (बार = NA, snafu =" हैलो, डेव "); foo [[बार]] <- सूची (ए = 1, बी = 2) '? –

+0

मैंने अभी 'JSON' आउटपुट दिखाया है क्योंकि आर सूची प्रारूप से समझना आसान है, लेकिन मैं आर डेटाफ्रेम से आर सूची में जाना चाहता हूं – nachocab

उत्तर

8

क्या split का उपयोग कर आप जिस तरह से अधिकतम लाभ उठाने के लिए, और rapply अंतिम चरण के लिए के बारे में:

nestedList 
# $A 
# $A$a 
# $A$a$tenant 
# [1] "Smith" 
# 
# $A$a$income 
# [1] "100" 
# 
# 
# $A$b 
# $A$b$tenant 
# [1] "Jones" 
# 
# $A$b$income 
# [1] "200" 
# 
# 
# 
# $B 
# $B$a 
# $B$a$tenant 
# [1] "Smith" 
# 
# $B$a$income 
# [1] "300" 
# 
# 
# $B$b 
# $B$b$tenant 
# [1] "Jones" 
# 
# $B$b$income 
# [1] "400" 

और संरचना:

> str(nestedList) 
List of 2 
$ A:List of 2 
    ..$ a:List of 2 
    .. ..$ tenant: chr "Smith" 
    .. ..$ income: chr "100" 
    ..$ b:List of 2 
    .. ..$ tenant: chr "Jones" 
    .. ..$ income: chr "200" 
$ B:List of 2 
    ..$ a:List of 2 
    .. ..$ tenant: chr "Smith" 
    .. ..$ income: chr "300" 
    ..$ b:List of 2 
    .. ..$ tenant: chr "Jones" 
    .. ..$ income: chr "400" 

nestedList <- rapply(lapply(split(data[-1], data[1]), 
          function(x) split(x[-1], x[1])), 
        f = function(x) as.character(unlist(x)), 
        how = "replace") 

यहाँ उत्पादन है

संरचना जो आप खोज रहे हैं उससे मेल नहीं खाती है, लेकिन इससे मदद मिल सकती है एक वैकल्पिक दृष्टिकोण के साथ शुरू करें।

1

मैं के रूप में समारोह को बदलने के द्वारा मेरे सवाल का समाधान मिल गया:

nestedList <- rapply(lapply(split(df[-1], df[1]), 
          function(x) split(x[-1], x[1])), 
        f = function(x) as.data.frame(as.list(split(x,x))), how = "replace") 
संबंधित मुद्दे

 संबंधित मुद्दे