2014-07-16 55 views
0

我想動態創建數據框併爲其分配自定義名稱。使用自定義名稱在R中創建動態數據框

我有一個主數據集是這樣的:

ID grp val1 val2 
1  a  32  9 
1  b  21  31 
1  c  43  76 
2  a  23  67 
2  b  5  45 
2  c  65  76 
3  a  43  34 
3  b  43  7 
3  c  12  87 
4  a  43  35 
4  b  65  87 
4  c  21  55 

我想喜歡

data1: 
ID grp val1 val2 
1  a  32  9 
1  b  21  31 
1  c  43  76 

data2: 
ID grp val1 val2 
2  a  23  67 
2  b  5  45 
2  c  65  76 

等造成的數據幀...

我已經嘗試了一些例如:

myID<-1:4 
df <- paste('data',myID, sep ='') 
ll <- sapply(df, function(x) 
{ 
    data.frame() 
    df<-masterData[which(masterData$ID==myID),] 
}) 

的另一個嘗試沒有預期的效果:

sapply(myID,function(x) df<-as.data.frame(masterData[which(masterData$ID==myID,])) 

我猜子集將不用於多個值做到這一點:

myframes<-list(subset(masterData,masterData$ID==myID)) 

回答

3

我只想用split,讓他們都在一個list

split(masterData, masterData$ID) 
# $`1` 
# ID grp val1 val2 
# 1 1 a 32 9 
# 2 1 b 21 31 
# 3 1 c 43 76 
# 
# $`2` 
# ID grp val1 val2 
# 4 2 a 23 67 
# 5 2 b 5 45 
# 6 2 c 65 76 
# 
# $`3` 
# ID grp val1 val2 
# 7 3 a 43 34 
# 8 3 b 43 7 
# 9 3 c 12 87 
# 
# $`4` 
# ID grp val1 val2 
# 10 4 a 43 35 
# 11 4 b 65 87 
# 12 4 c 21 55 

如果你真的想用大量的data.frame s擦掉你的工作場所,而不是把所有東西都保持在一個整齊的list,你可以使用list2env

X <- split(masterData, masterData$ID) 
names(X) <- paste0("data", names(X)) 
list2env(X, envir=.GlobalEnv) 
# <environment: R_GlobalEnv> 

ls(pattern = "^data[0-9]$")    ## What did that create? 
# [1] "data1" "data2" "data3" "data4" 
data1 
# ID grp val1 val2 
# 1 1 a 32 9 
# 2 1 b 21 31 
# 3 1 c 43 76 
+0

但我希望它是數據幀和命名。 –

+0

@NextDoorEngineer,*爲什麼*?但無論如何,更新了我的答案。 – A5C1D2H2I1M1N2O1R2T1

0

@Ananda Mahto的解決方案既緊湊又幹淨。您也可以修改代碼以獲得結果:

setNames(lapply(seq_along(df), function(i) masterData[masterData$ID==myID[i],]),df) 

然後用list2env

0

另一個答案是使用plyrdlply功能

library(plyr) 
dlply(dat, .(ID)) 

$`1` 
ID grp val1 val2 
1 1 a 32 9 
2 1 b 21 31 
3 1 c 43 76 

$`2` 
ID grp val1 val2 
1 2 a 23 67 
2 2 b 5 45 
3 2 c 65 76 

$`3` 
ID grp val1 val2 
1 3 a 43 34 
2 3 b 43 7 
3 3 c 12 87 

$`4` 
ID grp val1 val2 
1 4 a 43 35 
2 4 b 65 87 
3 4 c 21 55 
相關問題