2012-04-27 3 views
2

데이터를 재구성/축소하려고합니다. 지금까지 나는 (매우 느린) for 루프를 사용했지만, 내가 인식 한 것으로부터 이것은 Plyr으로 매우 빠르다.조건으로 데이터 서브 세트하기

나는 많은 그룹 (기업, 데이터 세트의 요소)을 가지고 있으며 그 회사의 모든 셀에 value에 대해 0 항목을 표시하는 모든 회사를 완전히 포기하려고합니다. 따라서 새로운 data.frame을 만들지 만 어느 시점에 value에 대해 0을 표시하는 모든 그룹을 제외하십시오.

for 루프 :

Data Creation: 

set.seed(1) 
mydf <- data.frame(firmname = sample(LETTERS[1:5], 40, replace = TRUE), 
     value = rpois(40, 2)) 

----------------------------- 
splitby = mydf$firmname 


new.data <- data.frame() 

for (i in 1:(length(unique(splitby)))) { 
temp <- subset(mydf, splitby == as.character(paste(unique(splitby)[i]))) 
    if (all(temp$value > 0) == "TRUE") {  
    new.data <- rbind(new.data, temp) 
} 
} 

Delete all empty firm factors 
new.data$splitby <- factor(new.data$splitby) 

plyr 패키지가 달성 할 수있는 방법이 있습니까? 그 문맥에서 subset 기능을 사용할 수 있습니까?

편집 : 문제를 재현하기 위해 BenBarnes에서 제안한대로 데이터 생성이 추가되었습니다. 벤, 정말 고마워. 또한 아래에 제공된 답변을 준수하도록 내 코드가 변경되었습니다.

+0

하지만,이 '['연산자를 사용하여 표준 서브셋처럼 들린다. – Andrie

+0

@Andrie 어떤 항목이 어떤 조건을 충족시키는 그룹의 모든 항목을 삭제하려는 것처럼 들리는군요. 그래서'plyr' 또는'by'가 더 쉬워 보인다. 1 월, 질문을 해결하는 데 도움이 될 것입니다. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

답변 해 주셔서 감사합니다. Ben이 제안한대로 게시물을 편집하고 데이터 재생산을 추가했습니다 (아래 참조). – Jan

답변

5

당신은 ddply().fun 인수에 익명 함수를 제공 할 수 있습니다 :

set.seed(1) 

mydf <- data.frame(firmname = sample(LETTERS[1:5], 40, replace = TRUE), 
    value = rpois(40, 2)) 

library(plyr) 

ddply(mydf,.(firmname), function(x) if(any(x$value==0)) NULL else x) 

또는 [를 사용 Andrie에 의해 제안 :

firms0 <- unique(mydf$firmname[which(mydf$value == 0)]) 

mydf[-which(mydf$firmname %in% firms0), ] 

ddply의 결과에 따라 정렬됩니다 ~ firmname

의견의 예를 들어 편집

는,이 방법은 세 개 이상의 항목 만 기업을 선택, 서브 세트 ddply()를 사용하는 것보다 다시 빠른 : 당신은 샘플 데이터를 제공하지 않는

firmTable <- table(mydf$firmname) 

firmsGT3 <- names(firmTable)[firmTable > 3] 

mydf[mydf$firmname %in% firmsGT3, ] 
+0

안녕하세요 벤, 위대한 답변을 주셔서 감사합니다! 그것은 내가 찾고 있었던 바로 그 것이다. 나는 두 번째 버전 ([운영])을 전체 그룹에 적용하는 방법을 몰랐다. 앞서 언급 한 것처럼 [작업은 Plyr 또는 for 루프보다 훨씬 빠릅니다. – Jan

+0

두 번째 대답은 단일 셀 값을 조절할 때 유용합니다. 또한 행 수를 조절할 때도 효과가 있습니까? 나는 (길이 (x $ firmname <3)) NULL else x)'와''''접근법을 사용하는 많은 다른 접근법을 시도했지만 Plyr :'mydf <- ddply (mydf,. (회사 명), function (x) 그것을 작동시키지 마십시오. – Jan

+0

나는 그것을 작동하게했다! 'ddply (mydf,. (회사 명), function (x) if (length (x $ firmname)> 3) NULL else x)'가 일을하고있다. 이것은 3 번 이상 관측 된 모든 그룹 (기업)을 선택합니다. '<'로이 데이터는 소트됩니다. 나는 그것이 단지 하나)'너무 많이 '라고 생각한다. – Jan

관련 문제