2011-11-07 3 views

답변

6

귀하의 질문은 명확하지 않지만 "중복 클래스"당 하나의 (무작위로 선택한) 행을 유지하면서 전체 데이터 프레임을 서브 샘플링한다고 가정합니다.

library(plyr) 
subsampled_data <- ddply(mydata,.(X), 
    function(x) { 
      x[sample(nrow(x),size=1),] 
    }) 

같은 뭔가 (는 테스트하지!) 작업을해야

+1

OP의 (수수한) 질문에 대한이 해석은 내 생각보다 더 가능성이 높습니다.이 질문에 대해서는 df [sample (which (df $ X == myVal), 1)]을 제안하려고합니다. – joran

+1

감사합니다 얘들 아, 내가 벤의 제안을, 조란, 어떻게 모든 칼럼 값에 적용하려는 경우 myVal 귀하의 미리보기에서 내 열 X, 예를 들어 수십 수백 가지 의미와 함께 변경 제안에 노력하고 있어요 8s etc. etc – Rad

+0

@Rad Ben의 솔루션이이를 처리 할 것입니다. 내 것이 아니다. 귀하의 질문을 다르게 해석했습니다. – joran

6

나의 첫번째 본능 벤의 우아한 ddply 솔루션과 같이했을 것이다. 그러나 이제는 대용량 데이터 세트를 사용 했으므로 확실히 빠른 방법이 있습니다.

RemoveDups <- function(df, column) { 
    inds = sample(1:nrow(df)) 
    df = df[inds, ] 

    dups = duplicated(df[, column]) 
    df = df[!dups, ] 
    inds = inds[!dups] 

    df[sort(inds, index=T)$ix, ] 
} 

는 (많은 고유 한 값으로 여기에) 일부 데이터를 시뮬레이션 :

> system.time(ddply(data, 'X1', function(x) x[sample(nrow(x), size=1), ])) 
    user system elapsed 
    3.264 0.921 4.315 
> system.time(RemoveDups(data, 'X1')) 
    user system elapsed 
    0.375 0.025 0.399 
:

n.row = 10^6 
n.col = 3 

set.seed(12345) 
data = data.frame(matrix(sample(1000, n.row*n.col, replace=T), nrow=n.row)) 

이 두 방법을 비교 여기에 여러 번 빨리 당신이 많은 고유 값이있는 경우 것 중 하나입니다

+0

우아한! 최고, 고마워요 존 – Rad

관련 문제