2017-04-14 31 views
0

我有一個數據幀DF這樣如何按我想要的順序拆分數據框?

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

我想由ID分裂。我用split(df, df$id),我得到

 
x y id 
15 0 1 

 
x y id 
10 5 2 
12 10 2 

但我想用ID的一個= 2來比一個ID爲之前= 1 所以基本上我想要的輸出爲

 
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 

您也可以使用rev(反向)

Sdf = rev(Sdf) 
+0

感謝。但對於我的問題,我不能使用反向,因爲數據幀是在循環中生成的,有時我希望數據從id = 1到id = 2。 – Taliman

+0

我不能使用反向來解決我的問題,因爲我有時想讓id按照從id = 1到id = 2的順序進行操作。 – Taliman

+0

確定。但是,如果您可以指定訂單,則可以使用第一種方法。 – G5W

1

split()文檔,列表的組件由f(電平轉換命名爲因素以後。 )fsplit()的第二個參數。因此,分塊後,塊按照因子級別的順序出現。

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()僅用於定義拆分。
  • 只需撥打factor()的附加電話,因爲id的類型爲integer

編輯這也可以沒有任何包來實現的:

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

有沒有其他方法可以在不使用任何包裝的情況下實現此目的? – Taliman

+0

@Taliman它可能但不容易記住。看我的編輯。 – Uwe

+0

這太好了。謝謝。 – Taliman