2015-01-28 3 views
0

다섯 개의 데이터 프레임 목록이 있습니다. 각 데이터 프레임에는 차원 열과 값 열이 각각 하나씩 있습니다. 벡터의 내용을 기반으로 목록의 각 데이터 프레임을 하위 집합으로 만들고 싶습니다.벡터 내용을 기준으로 목록의 데이터 프레임을 서브 세트

df <- data.frame(x = 1:100, y2 = runif(100, 0, 100), y3 = runif(100, 0, 100), y4 = runif(100, 0, 100), y5 = runif(100,0,100)) 
df2 <- data.frame(x = 1:100, y2 = runif(100, 0, 100), y3 = runif(100, 0, 100), y4 = runif(100, 0, 100), y5 = runif(100,0,100)) 
df3 <- data.frame(x = 1:100, y2 = runif(100, 0, 100), y3 = runif(100, 0, 100), y4 = runif(100, 0, 100), y5 = runif(100,0,100)) 
df4 <- data.frame(x = 1:100, y2= runif(100, 0, 100), y4 = runif(100, 0, 100), y4 = runif(100, 0, 100), y5 = runif(100,0,100)) 
df5 <- data.frame(x = 1:100, y2= runif(100, 0, 100), y4 = runif(100, 0, 100), y4 = runif(100, 0, 100), y5 = runif(100,0,100)) 
frames <- list(df, df2, df3, df4, df5) 

따라서이 예에서 내 목록은 "프레임"입니다. 이제 나는 다음과 같은 벡터가 있다고 가정 해 봅시다 : 여기

subs <- 50:60 

내 목표는 첫째 colunmn의 값이 잠수정 벡터 내부입니다 각 dataframe 만 행이 포함되도록 dataframes의 목록을 부분 집합하는 것입니다.

어떤 조언이 필요합니까?

감사합니다, 벤

+0

모든 데이터 프레임이 동일한 열을 갖고 있다면, 왜 모두 'rbind'하지 않습니까? 단일 데이터 세트로? –

+0

지금은 목록 구조를 유지할 필요가 있습니다 – mangodreamz

+0

당신의 추론은 잘 모르겠지만 단순히'data.table :: rbindlist (frames, idcol = "ID")'와 같은 것을 할 수 있고 단일' 각 data.frame의 ID를 유지하면서 data.table 객체를 생성한다. * 모든 작업을 끝내면'ID'에 의해'split '되어리스트로 돌아갈 수 있습니다. –

답변

4

보인다 거의 모든 질문은 요를 일으키는 동일한 열이있는 데이터 프레임 목록과 관련된 것입니다. u는 매 작업마다 lapply 루프를 사용합니다 (매우 비효율적 인 것처럼 보임).

또는 각 data.frame의 ID를 유지하면서 모든 목록을 단일 객체로 묶기 만하면 대부분의 작업을 벡터화 할 수 있으며 모든 데이터 조작이 끝나면 split을 사용하여 목록으로 다시 나눌 수 있습니다 .

여기

library(data.table) 
Res <- rbindlist(frames, idcol = "ID")[x %between% subs] 
#  ID x  y2  y3  y4  y5 
# 1: 1 50 54.692889 58.51886 12.754368 35.61516 
# 2: 1 51 21.206308 12.77442 52.440787 93.67734 
# 3: 2 50 12.655685 84.55044 3.194644 54.46706 
# 4: 2 51 83.840276 61.32614 61.139038 92.39402 
# 5: 3 50 54.847797 20.68419 19.585931 48.87072 
# 6: 3 51 75.510691 68.17955 98.696579 91.48688 
# 7: 4 50 63.203071 95.94132 41.835923 60.68250 
# 8: 4 51 75.481676 51.67619 80.393557 24.48381 
# 9: 5 50 65.744847 50.36983 86.548843 83.31730 
# 10: 5 51 4.956835 57.25666 27.106395 32.92020 

결국 data.tabledevelopment version on Github (dplyr::unnest를 사용하여 당신이 얻을 수있는 비슷한 결과를) 사용 예입니다 당신이 단지에서

split(Res, Res$ID) 

을 할 것입니다 (이후의 모든 데이터 조작 완료) data.frames를 목록으로 다시 가져 오도록 주문하십시오.

+0

으로 바꿀 수 있습니다. 따라서 data.table을 사용하면 더 빨리 처리 할 수 ​​있습니다. (예 : 프레임, 함수 (p) {p [p [, 1] 결과? 다 도와 줘서 고마워 데이빗! – mangodreamz

+1

예, 전체 데이터 세트에서 벡터화 할 수 있고 'lapply'루프를 사용할 필요가 없기 때문에 가능합니다.나는'Res'를 생성 한 후에'rm (frames)'을 제안 할 것이므로 큰 데이터 세트를 가지고 있다면 메모리 문제가 발생하지 않을 것입니다. –

1

당신은 당신의 첫번째 열은 모두 이름 x는 경우 lapply

lapply(frames, function(.dat) .dat[with(.dat, x %in% subs),]) 
1

, 당신은 프레임에 lapply 을 사용할 수 있습니다 시도 할 수 있습니다 :

lapply(frames,function(p){p[p$x %in% subs,]})  
+0

이름이 아닌 열 인덱스를 참조해야한다면이 방법도 사용할 수 있다고 가정하고 있습니까? – mangodreamz

+0

예. – mangodreamz

+0

예, p $를 p [, 1] – NicE

관련 문제