2013-03-05 3 views
-1

큰 데이터 프레임 (1 백만 + 행)에서 특정 범위 내에 있고 세 번째 기준을 만족하는 요소 (행)의 수를 세고 있습니다. 나는 그 범위의 33을 가지고 있고, 나에게 대답을 얻으려고 매우 느린 루프를 사용한다, 문제 없다.데이터 프레임 서브 세트하기 R for avoid 루프

속도가 매우 중요하므로 빠른 실행을 위해 도움을 주시면 감사하겠습니다. for 루프와 "vectorise"또는 어떤 종류의 "적용"솔루션을 제거 할 수 있습니까? 사전에

감사

코드 :

N.data<-c(1:33) 
Lower<-c(0,100000,125000,150000,175000,200000,225000,250000,275000,300000,325000,350000,375000,400000,425000,450000,475000,500000,550000,600000,650000,700000,750000,800000,850000,900000,950000,1000000,1100000,1200000,1300000,1400000,1500000) 

Upper<-c(100000,125000,150000,175000,200000,225000,250000,275000,300000,325000,350000,375000,400000,425000,450000,475000,500000,550000,600000,650000,700000,750000,800000,850000,900000,950000,1000000,1100000,1200000,1300000,1400000,1500000, 5000000) 

for (i in 1:(length(N.data))){ 
N.data[i]<-nrow(dataset[dataset$Z==c & dataset$X > Lower[i] & dataset$X < Upper[i],]) 
} 
+0

적어도 하나의 데이터 프레임 (1 백만 + 행이있는 것) – TARehman

+0

'N.data <-c (1:33)'의 하위 집합을 게시 할 수 있습니까? '길이 (N.data)'. '[1] 33' – vaettchen

답변

0

apply. 이것들은 for 루프의보다 효율적인 구현 일뿐입니다. 벡터화를 사용하여 추구하고자하는 것을 달성하려면 여기 하나의 접근법이 있습니다.

# Create a Dummy Dataset and Breaks 
dataset = data.frame(
    X = rpois(100, 10), 
    Z = rpois(100, 20) 
) 
breaks = seq(0, max(dataset$Z), length = 5) 

# Add Column with Breaks 
dataset = transform(dataset, Z2 = cut(Z, breaks, labels = FALSE)) 


# Use Aggregate to compute length for each value of Z2 
c = 10 
aggregate(Z ~ Z2, data = dataset, length, subset = (X == c)) 

완전히 벡터화되어 있기 때문에 mapply을 사용하는 것이 더 효율적입니다.

+0

답장을 보내 주셔서 대단히 감사드립니다. 확실히 이것이보다 효율적인 구현임을 알 수 있습니다. 위에서 언급 한 제안이 "빈"범위에 대해 제로 값을 제공하는 반면, 귀하는 단순히 생략합니다. 비어있는 범위에 대해 0을 반환하도록 코드의 마지막 줄을 어떻게 바꿀 수 있습니까? 사전에 감사드립니다 – Smackboyg

+0

여기에 대한 답변이 필요 없으며 간단한 ifelse 문을 사용하여 직접 해결책을 찾았습니다. – Smackboyg

1

보다 효율적인 접근 방법 : 기능은 벡터화되지

# first logical index (vector) 
idx1 <- dataset$Z == c 

# second logical index (matrix) 
idx2 <- mapply(function(l, u) dataset$X > l & dataset$X < u, Lower, Upper) 

# combine both indices and count number of rows 
N.data <- colSums(idx1 & idx2) 
+0

대단히 감사합니다! – Smackboyg