2014-02-18 22 views
1

從數據幀中,我想提取特定Y範圍內(X的唯一值的數量)(例如,每隔0-100,101-200 ,201-300等可達3000)。數據幀範圍內的唯一值數量

例DF

X   Y 
169  183 
546  64 
154  148 
593  203 
60  243 
568  370 
85  894 
168  169 
154  148 
83  897 
… 

一個耗時的方法是將運行每個範圍下面的代碼時間:

junk<-subset(df, Y > 0 & Y < 100) 

length(unique(junk$record.no)) 

但我要問專家 - 必須有一個更好的辦法?

回答

0

您可以根據您想要的範圍和數據框的大小循環運行,然後通過轉換爲因子計算級別數:

range <- 100 #based on example 
loops <- nrow(df)/range 
lvlMatrix <- matrix(nrow=0,ncol=2,dimnames=list(NULL,c("range","unique values"))) 
for(a in 1:loops){ 
    sub <- df[((a-1)*range):(range*a),] 
    lvls<-nlevels(factor(sub$X)) 
    lvlMatrix <- rbind(lvlMatrix,cbind(paste(as.character((a-1)*range),"-",as.character(range*a),sep=""),lvls)) 
} 
1

這似乎是有效的:

aggregate(DF$X, list(cut(DF$Y, seq(0, 1000, 100))), function(x) unique(x)) 
# Group.1    x          #or length(unique(x)) 
#1 (0,100]   546 
#2 (100,200] 169, 154, 168 
#3 (200,300]  593, 60 
#4 (300,400]   568 
#5 (800,900]  85, 83 
2

您可以by()cut()做到這一點:

data <- data.frame(X=ceiling(rnorm(10000, 500, 10)), Y=runif(10000, 0, 3000)) 
data$Groups <- cut(data$Y, seq(0, 3000, 100)) # Create a categorical variable for each range 

by(data$X, data$Group, function(x) length(unique(x))) 
+0

+1'表(數據$組)'在這一點上也能很好地工作。注意用對象覆蓋函數'data'。 –