2013-10-21 2 views
1

질문 데이터베이스에서 보았지만 대답을 찾지 못했습니다. 미안해 내가 뭔가를 놓친다면. 질문은 매우 간단합니다. 다른 ID의 열 ID를 기반으로 새 데이터 프레임을 만들려면 어떻게해야합니까?다른 데이터 프레임의 각 ID에 대한 데이터 프레임을 만듭니다

원래 DF이는 경우 : ID에 나는 두 개의 새로운 안양을 만들 수있는 방법

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") 

을 기반으로? 그래서 예를 들어 B21T와 P1이라는 이름의 두 가지 새로운 df를 가질 수 있습니까? 하위 집합으로 할 수 있다는 것을 알고 있지만 많은 ID가 있으면 많은 시간이 걸릴 것입니다.

그래서 내가 찾고있는 것은 하위 집합 기능을 자동화하는 방법이라고 생각합니다.

답변

0

당신은 거기에서 그들을 추출 후, list에서 당신이 원하는 모든 다른 하위 집합을 넣어 수 있습니다

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

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

하는이 시간이 좀 걸릴 수 있습니다

#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 

당신이 원하는 dataframe를 accesss 수 있습니다 그러나, 당신이 정말로 많은 "ID"를 가지고 있다면.

EDIT 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) 
관련 문제