2013-07-17 36 views
2

我想根據其中一個因子變量的級別拆分現有數據框,以便拆分數據框的名稱將與該因子的級別相對應。按因子和名稱數據框的級別拆分數據幀

df <- data.frame(cbind(X = 1:10, Y = rnorm(10)), Z = sample(LETTERS[1:3], 10, replace = TRUE)) 

如果df是原始數據框,我想把它分成三個dataframes稱爲ABC,使得:

A = subset(df, Z == 'A') 
B = subset(df, Z == 'B') 
... 

有一個簡單的辦法一次性做到這一點?我有一個巨大的數據集和因子變量有太多的水平。

回答

4

您可以用plyr

require(plyr) 
dlply(df, .(Z)) 
2
sapply(levels(df$Z), function(x) list(subset(df, Z == x))) 

這將返回一個列表,其中包含以df $ Z的級別命名的元素,每個元素包含df的子集。

行動,一個更好的答案被提供,但已被刪除 - 我會在這裏把解決方案:

split(df, df$Z) 
5

在基礎R,你應該使用功能split。並且split具有default方法和data.frame。但是,我發現split.data.frame是非常緩慢的,因爲分裂的層數變得很大。也就是,

# inefficient in my opinion 
split(df, df$Z) 

上述解決方案會給你你直接要求的名字,但會在很大程度上窒息。

而且,如果你願意使用速度/效率,外部包交易,我建議使用data.table包:

require(data.table) 
dt <- data.table(df) 
oo <- dt[, list(list(.SD)), by = Z]$V1 
names(oo) <- unique(dt$Z) 
+1

護理做爲第二個解決方案提供一些解釋?第3行和第4行(但大部分是3)對於R新手(我)來說看起來像是黑魔法。 –