2014-10-08 78 views
2

考慮下面的數據框:從數據幀R中創建一個列表

test.df <- data.frame(a = c("1991-01-01","1991-01-01","1991-02-01","1991-02-01"), b = rnorm(4), c = rnorm(4)) 

我想從test.df創建列表。該列表的每個元素將是對應於具體值column a(即每個日期)的子集數據幀test.df。換句話說,在這種情況下,column a取值爲1991-01-011991-02-01。因此,結果列表將包含兩個元素:test.df的子集a = 1991-01-01(不包括列a),而列表的其他元素將爲test.df的子集1991-02-01 = 2(不包括列a)。這裏是我正在尋找的輸出:

lst <- list(test.df[1:2,2:3], test.df[3:4,2:3]) 

請注意子集數據幀可能不具有相同的行數。

在我的實際示例中,第a列是包含更多值的日期列。

我將不勝感激任何幫助!非常感謝!

+1

'LST '是輸出的例子。 – Mayou 2014-10-08 13:23:14

回答

5

您可以使用split

lst <- split(test.df, test.df$a) 

如果你想擺脫a柱,使用split(test.df[-1], test.df$a)(感謝@akrun徵求意見)。

+2

你可以使用'split(test.df [, - 1],test.df $ a)' – akrun 2014-10-08 13:21:39

+0

哦好吧,謝謝 – konvas 2014-10-08 13:21:59

+0

謝謝你們,這真是太棒了! – Mayou 2014-10-08 13:22:54

2

您可以使用下面的代碼:

sapply(union(test.df$a,NULL), function(y,x) x[x$a==y,], x=test.df, simplify=FALSE) 
1

您也可以使用dlply功能在plyr包:

> library(plyr) 

> dlply(test.df, .(a)) 
$`1991-01-01` 
      a   b   c 
1 1991-01-01 1.3658775 0.9805356 
2 1991-01-01 -0.2292211 2.2812914 

$`1991-02-01` 
      a   b   c 
1 1991-02-01 -0.2678131 0.5323250 
2 1991-02-01 0.3736910 0.4988308 

還是data.table包:

> library(data.table) 

> setDT(test.df) 
> dt <- test.df[, list(list(.SD)), by = a]$V1 
> names(dt) <- unique(test.df$a) 

> dt 
$`1991-01-01` 
      b   c 
1: 1.3658775 0.9805356 
2: -0.2292211 2.2812914 

$`1991-02-01` 
      b   c 
1: -0.2678131 0.5323250 
2: 0.3736910 0.4988308 
相關問題