2017-12-13 11 views
3

whiskerパッケージで期待されるデータ構造を作成しようとしていますが、 のデータフレームからその構造を作成する方法がわかりません。のは、私は、次のデータフレームを持っているとしましょう:データフレームを深くネストされたリストに変換する

library(dplyr) 

existing_format <- 
    mtcars %>% 
    select(carb, gear, cyl) %>% 
    arrange(carb, gear, cyl) %>% 
    distinct() 

...私は、次の目的の形式にexisting_formatから行ってみたい(desired_formatリストの最初の2つの要素のみが示されている):

desired_format <- list(
    list( 
    carb = "1", 
    gear = list(
     list(gear = "3", cyl = list(list(cyl = "4"), list(cyl = "6"))), 
     list(gear = "4", cyl = list(list(cyl = "4"))) 
    ) 
), 
    list( 
    carb = "2", 
    gear = list(
     list(gear = "3", cyl = list(list(cyl = "8"))), 
     list(gear = "4", cyl = list(list(cyl = "4"))), 
     list(gear = "5", cyl = list(list(cyl = "4"))) 
    ) 
) 
) 

私はcarbgearでグルーピングするようなことを試した後、tidyr::nest()を使ってネストされたdfを作成しましたが、何もしていません。何かは私に、whisker::iteratelist()またはwhisker::rowSplit()が進む道だと言いますが、私はそれを理解できません。

おかげで、 クリス

+1

'dflistのために働く< - lapply((existing_format%>。。%スプリット([ 'CARB'])) 、 function(xtbl)xtbl%>%split(。、。[、 'gear'])) 'これはあなたに頭のスタートを与えるかもしれません。助けてくれる – Masoud

+1

、お返事ありがとうございます – Chris

答えて

4

それは、この場合にする必要がありますが、あなたは、再帰的分割

rsplit<-function(dd) { 
    col <- names(dd)[1] 
    dat <- dd[[1]] 
    xx <- lapply(unique(dat), function(x) { 
    z <- setNames(list(x), col) 
    if(ncol(dd)>1) { 
     z[[names(dd)[2]]] <- rsplit(dd[dat==x,-1, drop=FALSE]) 
    } 
    z 
    }) 
    xx 
} 

rsplit(existing_format) 

これは、すべての列に分割してから名前を使用する操作を行うことができますよりも、おそらく、より柔軟に列ヘッダー

1

ここでn列のための一般的な方法ではないのですが、それは3

library(purrr) 
library(magrittr) 
library(dplyr) 

output <- existing_format       %>% 
    map_df(as.character)       %>% 
    group_by(carb,gear)        %>% 
    summarize_at("cyl",~lst(map(.,~lst(cyl = .x)))) %>% 
    mutate(gear = map2(.x = gear,.y = cyl,~lst(gear = .x,cyl = .y))) %>% 
    group_by(carb)         %>% 
    summarize_at("gear",~lst(gear=.))    %$% 
    map2(.x = carb,.y = gear,~lst(carb = .x,gear = .y)) 

identical(output[1:2],desired_format) #TRUE 
+0

あなたは私よりも別のバージョンのpurrrから作業しているかもしれませんが、b/c私はあなたの答えを実行する際にエラーが発生していました。私は私のために動く版にそれを編集しました(あなたがそれが戻って変更されるべきであると思ったら私に知らせてください) – Chris

+0

編集承認;) –

関連する問題