2013-10-21 68 views
1

我查看了問題數據庫,但沒有找到答案,所以很抱歉如果我錯過了某些內容。 問題很簡單:如何根據另一個列的ID創建新的數據框?爲另一個數據幀的每個ID創建數據幀

如果在原來的DF:

structure(list(ID = structure(c(12L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L), .Label = c("B0F", 
"B12T", "B1T", "B21T", "B22F", "B26T", "B2F", "B33F", "B3F", 
"B4F", "B7F", "P1", "P21", "P24", "P25", "P27", "P28", "P29"), class = "factor"), 
    EC = c(953L, 838L, 895L, 2170L, 2140L, 1499L, 2120L, 881L, 
    902L, 870L, 541L, 891L, 876L, 860L, 868L, 877L, 3630L, 3400L, 
    2470L, 2330L, 1810L, 2190L, 2810L, 2200L, 2440L, 1111L, 2460L, 
    2210L, 2340L, 1533L, 880L, 2475L, 2350L, 2440L, 1456L, 2320L, 
    2220L, 2990L, 2240L, 2210L, 2630L)), .Names = c("ID", "EC" 
), row.names = 40:80, class = "data.frame") 

如何創建兩個新的DF,基於ID?所以我可以有兩個新的df命名爲B21T和P1例如? 我知道我可以用一個子集來做,但是如果我有很多ID,它會花費很多時間。

所以我認爲我正在尋找的是一種自動化子集函數的方法。

回答

0

你可以把你想要的所有不同的子集在list和,然後從那裏提取出來:

#DF <- structure(list(ID = structure(c(12L ... 

#all different "ID"s 
ids <- as.character(unique(DF$ID)) 

#create empty list to insert all different subsets 
myls <- vector("list", length(ids)) 

#insert the different subsets 
for(i in 1:length(ids)) 
{ 
    myls[[i]] <- DF[DF$ID == ids[i],] 
} 

names(myls) <- ids 

可以accesss想要的數據框:

> myls$P21 
    ID EC 
56 P21 3630 
57 P21 3400 
... 

> myls$P1 
    ID EC 
40 P1 953 
41 P1 838 
... 

這可能需要一些時間但是,如果你有很多「ID」。

編輯 Waaay比for更好回答是Jilber的回答。這裏用作split(DF, DF$ID, drop = T)

+1

您可以通過'split'更換'for'循環。請參閱'?split'。 –

1

考慮df是你data.frame,然後就去做:

df$ID <- droplevels(df$ID) # drop unused levels from `ID` 
list2env(split(df, df$ID), envir=.GlobalEnv)