2010-07-21 131 views
59

我想將一個數據幀分成幾個較小的數據幀。這看起來像一個非常微不足道的問題,但我無法從網絡搜索中找到解決方案。如何拆分數據框?

+1

從未理解'split()',但是使用['dtile'中的''ntile'](http://stackoverflow.com/a/27646599/1888983),然後按組索引(「quartile」)過濾我想要的是:'group = df [df $ quartile == i,]'。 – jozxyqk 2015-02-17 08:14:12

回答

18

如果你想根據某些變量的值拆分數據框,我建議使用plyr包中的daply()

library(plyr) 
x <- daply(df, .(splitting_variable), function(x)return(x)) 

現在,x是一個數據幀的數組。要訪問其中一個數據框,可以使用分割變量的級別名稱對其進行索引。

x$Level1 
#or 
x[["Level1"]] 

我確信在將數據分解爲多個數據幀之前,沒有其他更聰明的方式來處理數據。

+0

請提前說明非基礎功能所在的軟件包 - 大概您是指軟件包plyr中的軟件包? – mdsumner 2010-07-21 20:12:05

+0

我在我的代碼片段中加載了plyr,所以我認爲它很清楚,但爲了清楚起見,我將編輯答案散文。 – JoFrhwld 2010-07-21 20:18:52

+1

你不是指'dlply'嗎? – hadley 2010-07-21 20:33:46

51

您可能還需要將數據幀切成小dataframes任意數量。在這裏,我們切入兩個數據框。

x = data.frame(num = 1:26, let = letters, LET = LETTERS) 
set.seed(10) 
split(x, sample(rep(1:2, 13))) 

$`1` 
    num let LET 
3 3 c C 
6 6 f F 
10 10 j J 
12 12 l L 
14 14 n N 
15 15 o O 
17 17 q Q 
18 18 r R 
20 20 t T 
21 21 u U 
22 22 v V 
23 23 w W 
26 26 z Z 

$`2` 
    num let LET 
1 1 a A 
2 2 b B 
4 4 d D 
5 5 e E 
7 7 g G 
8 8 h H 
9 9 i I 
11 11 k K 
13 13 m M 
16 16 p P 
19 19 s S 
24 24 x X 
25 25 y Y 
+0

Greg, 您的解決方案正常工作! 謝謝。 – Leo5188 2010-07-21 19:11:27

+0

沒問題。我很高興它做到了。 – Greg 2010-07-21 19:47:25

+1

嘿格雷格,我無法理解示例命令的語法,你能解釋它嗎? – Anirudh 2015-02-01 09:45:44

3

你想要的答案在很大程度上取決於你想如何和爲什麼要分手的數據幀。

例如,如果您想省略一些變量,則可以從數據庫的特定列創建新的數據幀。數據框後括號中的下標是指行號和列號。檢查Spoetry的完整描述。

newdf <- mydf[,1:3] 

或者,您可以選擇特定的行。

newdf <- mydf[1:3,] 

而且這些下標也可以是邏輯測試,例如選擇包含特定值的行或具有期望值的因子。

你想用剩下的塊做什麼?你需要對每個數據庫塊執行相同的操作嗎?然後,您需要確保數據框的子集以方便的對象(如列表)結束,這將有助於您在每個數據框的塊上執行相同的命令。

12

我剛剛發佈了一個樣的RFC的,可以幫助你:Split a vector into chunks in R

x = data.frame(num = 1:26, let = letters, LET = LETTERS) 
## number of chunks 
n <- 2 
dfchunk <- split(x, factor(sort(rank(row.names(x))%%n))) 
dfchunk 
$`0` 
    num let LET 
1 1 a A 
2 2 b B 
3 3 c C 
4 4 d D 
5 5 e E 
6 6 f F 
7 7 g G 
8 8 h H 
9 9 i I 
10 10 j J 
11 11 k K 
12 12 l L 
13 13 m M 

$`1` 
    num let LET 
14 14 n N 
15 15 o O 
16 16 p P 
17 17 q Q 
18 18 r R 
19 19 s S 
20 20 t T 
21 21 u U 
22 22 v V 
23 23 w W 
24 24 x X 
25 25 y Y 
26 26 z Z 

乾杯, 塞巴斯蒂安

10

你也可以使用

data2 <- data[data$sum_points == 2500, ] 

這將使一個數據幀sum_points = 2500的值其中sum_points = 2500

它給出:

airfoils sum_points field_points init_t contour_t field_t 
... 
491  5  2500   5625 0.000086 0.004272 6.321774 
498  5  2500   5625 0.000087 0.004507 6.325083 
504  5  2500   5625 0.000088 0.004370 6.336034 
603  5  250  10000 0.000072 0.000525 1.111278 
577  5  250  10000 0.000104 0.000559 1.111431 
587  5  250  10000 0.000072 0.000528 1.111524 
606  5  250  10000 0.000079 0.000538 1.111685 
.... 
> data2 <- data[data$sum_points == 2500, ] 
> data2 
airfoils sum_points field_points init_t contour_t field_t 
108  5  2500   625 0.000082 0.004329 0.733109 
106  5  2500   625 0.000102 0.004564 0.733243 
117  5  2500   625 0.000087 0.004321 0.733274 
112  5  2500   625 0.000081 0.004428 0.733587 
+0

嗨,如果您想根據該列中的唯一值將其動態分割爲不同的data_frame,那麼您會如何處理。 – 2017-04-06 02:54:36

3

如果您想要按其中一列的值拆分,可以使用lapply。例如,分裂ChickWeight到一個單獨的數據集爲每個小雞:

data(ChickWeight) 
lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,]) 
1

拆分所述數據幀似乎適得其反。相反,使用分裂申請-結合範例,例如,生成一些數據

df = data.frame(grp=sample(letters, 100, TRUE), x=rnorm(100)) 

然後分裂僅相關列並應用scale()函數爲x的每個組中,和(使用split<-ave)合併結果

df$z = 0 
split(df$z, df$grp) = lapply(split(df$x, df$grp), scale) 
## alternative: df$z = ave(df$x, df$grp, FUN=scale) 

與拆分data.frames相比,這將非常快速,並且結果仍然可用於下游分析而無需迭代。我認爲dplyr語法

library(dplyr) 
df %>% group_by(grp) %>% mutate(z=scale(x)) 

一般來說,這dplyr解決方案比拆分數據幀速度快,但速度不如拆分申請-結合。