2017-05-03 4 views
1

私は未知の階層Rの中でループを探しています(私は要求時にのみデータを知っています)。たとえば 、私は最高のHierachyを要求し、私は書籍カテゴリにループにしたい次のステップのためにデータフレーム未知の階層全体のループR

id name 
1 Books 
2 DVDs 
3 Computer 

に入れて、私はID(1)との新しい要求を行い、取得:

再び
id name 
11 Child books 
12 Fantasy 

は、今私が子どもの本の次の親catagoryに見てみたいとid(11)

id name 
111 Baby 
112 Education 
113 History 

などなどのための新しい要求を実行します。

id name 
1111 Sound 
1112 Touch 

この時点では、各階層の深さはわかりませんが、それぞれのカテゴリごとに異なることがわかります。

Id name  Id name   Id name  id name  id name 
1 Books  11 Child books 111 Baby  1111 Sound ... 
1 Books  11 Child books 111 Baby  1112 Touch ... 
1 Books  11 Child books 112 Education etc. 
1 Books  11 Child books 113 History etc. 
1 Books  12 Fantasy  etc. 
................. 
2 DVDs  etc. 
................. 
3 Computer etc. 
................. 

だから私は、次の階層の行の番号を抽出し、行にその回数を繰り返すことができます。最後に私は、データフレームは、次のようになりますことをしたいと思います。

df[rep(x,each=nrow(df_next)),] 

しかし、私は未知の(そして変更している)iをどのようにループするか分かりません。

答えて

1

はここではないので、エレガントなソリューションです:

(I)subFnが異なる長さに基づいてidを分割するカスタム関数です:

subFn <- function(id){ 
      len <- nchar(id) 
      tmp <- lapply(1:len, function(x)substring(id, x, x)) 
      names(tmp) <- paste0("level_", 1:length(tmp)) 
      return(tmp) 
     }  

## example 
subFn("1111") 
$level_1 
[1] "1" 

$level_2 
[1] "1" 

$level_3 
[1] "1" 

$level_4 
[1] "1" 

(ⅱ)data.frameのリストを作成しますIDは、その長さに基づいて、列の異なる数に分割される:

dat_list <- lapply(list(df1, df2, df3), function(x) do.call(data.frame, c(list(name=x[, "name"], stringsAsFactors=FALSE), subFn(x[, "id"])))) 

(III)Tに参加するdplyr left_joinを使用します時のフレームヲ:

df1 <- data.frame(id = 1:3, name = c("Books", "DVDs", "Computer")) 
df2 <- data.frame(id = 11:12, name = c("Child books", "Fantasy")) 
df3 <- data.frame(id = 111:113, name=c("Baby", "Education", "History")) 

dat_list[[1]] %>% 
    left_join(dat_list[[2]], by="level_1") %>% 
    left_join(dat_list[[3]], by=c("level_1", "level_2")) 

    name.x level_1  name.y level_2  name level_3 
1 Books  1 Child books  1  Baby  1 
2 Books  1 Child books  1 Education  2 
3 Books  1 Child books  1 History  3 
4 Books  1  Fantasy  2  <NA> <NA> 
5  DVDs  2  <NA> <NA>  <NA> <NA> 
6 Computer  3  <NA> <NA>  <NA> <NA> 

複数data.frameをleft_joiningで長く複雑な手順を防止するために、ここでHow to join multiple data frames using dplyr?

func <- function(...){ 
    df1 <- list(...)[[1]] 
    df2 <- list(...)[[2]] 
    col <- grep("level", names(df1), value=T) 
    left_join(..., by = col) 
    } 

Reduce(func, dat_list) 

入力データに触発されたソリューションです

関連する問題