2017-09-14 21 views
0

約100万個のobsを持つデータフレームを取得しました。 20変数。変数にはレベルと部品ID情報が含まれます。 基本的にはツリー構造のデータフレームに似ています。私は 'レベル'(レベル< 20)に各行ベースのパスを作成したい。以下は例であり、「Path」という列は私が作成したいものです。 私は現在、パスを作成するためにifを入れ子にしたfor-loopを使用しています。それは各行を処理するので、私のラップトップは100万行のパスを得るのに5〜6時間かかります。どのようにパスをより効率的にするためのアイデアはありますか?ありがとうございました!ツリー構造の各ノードのパスを作成R

Level Part ID Path 
1  11111 11111 
2  22222 11111/22222 
3  33333 11111/22222/33333 
3  44444 11111/22222/44444 
4  55555 11111/22222/44444/55555 
2  66666 11111/66666 
1  77777 77777 
2  88888 77777/88888 

答えて

0

このテストを使用してデータ

dd <- read.table(text="Level PartID Path 
1  11111 11111 
2  22222 11111/22222 
3  33333 11111/22222/33333 
3  44444 11111/22222/44444 
4  55555 11111/22222/44444/55555 
2  66666 11111/66666 
1  77777 77777 
2  88888 77777/88888", header=T) 

は、それはおそらく、単一のループで行うことが最も効率的です。たとえば、

get_path <- function(level, part) { 
    path <- character(length(level)) 
    current_parts <- c() 
    for(i in seq.int(length(path))) { 
     current_level <- level[i] 
     current_parts[current_level] <- part[i] 
     path[i] <- paste(current_parts[1:current_level], collapse="/") 
    } 
    path 
} 
get_path(dd$Level, dd$PartID) 
+0

ライン5はタイプミスで、元のテーブルを更新しました。大規模なデータセットでこれを試し、どれくらいの時間がかかるか見てみましょう。ありがとうMrFlick。 – Vincent

+0

これを50万行のデータセットで試して、完全に機能しました。 1分もかからなかった。これはまさに私が望んでいたものだ。 ! – Vincent