2017-04-14 10 views
0

私はidで分割したいこのデータフレームをどのように分割したいのですか?

 
df 
x  y id 
10 5  2 
12 10 2 
15 0  1 

のようなデータフレームDFを持っています。だから、基本的に、私は出力が

になりたい私は split(df, df$id)を使用し、私は

 
x y id 
15 0 1 

 
x y id 
10 5 2 
12 10 2 

を取得しかし、私は、ID = 2と1 = 1 idを持つものよりも前に来てほしいです

 
x  y  id 
10 5  2 
12 10  2 

 
x y id 
15 0 1 

答えて

1

リスト内の要素の順序を切り替えるだけです。

Sdf = split(df, df$id) 
Sdf = Sdf[c(2,1)] 

$`2` 
    x y id 
1 10 5 2 
2 12 10 2 

$`1` 
    x y id 
3 15 0 1 

ます。またsplit()の文書によるとrev(リバース)

Sdf = rev(Sdf) 
+0

感謝を。しかし、私の問題では、データフレームがループ内で生成され、データをid = 1からid = 2にしたいときがあるので、私は逆を使うことはできません。 – Taliman

+0

idがid = 1からid = 2になるようにidを欲しいときがあるので、私は問題のためにreverseを使うことはできません – Taliman

+0

OK。しかし、順序を指定できる場合は、最初の方法を使用できます。 – G5W

1

を使用することができ、リストのコンポーネントが要因に変換した後(fのレベルによって命名されています。.. 。)。 はsplit()の2番目のパラメータです。したがって、チャンクは分割後に因子レベルの順に表示されます。

OP has requestedチャンクは、dfと同じ順序で返す必要があります。これは、ハドレーのforcatsパッケージのfct_inorder()機能を便利に達成することができます:

split(df, forcats::fct_inorder(factor(df$id))) 
#$`2` 
# x y id 
#1 10 5 2 
#2 12 10 2 
# 
#$`1` 
# x y id 
#3 15 0 1 

注意を、

  • id自体は変わらないということ。 fct_inorder()は、分割の定義にのみ使用されます。
  • idintegerであるため、factor()への追加呼び出しが必要です。

編集これはまた、すべてのパッケージなしで達成することができます。

split(df, factor(df$id, levels = unique(df$id))) 
+0

パッケージを使用せずにこれを達成できる他の方法はありますか? – Taliman

+0

@タリマンそれは可能ですが、覚えにくいです。私の編集を参照してください。 – Uwe

+0

これは素晴らしいことです。ありがとう。 – Taliman

関連する問題