数据框范围内的唯一值数

时间:2014-02-18 13:44:09

标签: r plyr

从数据框架中,我想在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))

但我必须问专家 - 必须有更好的方法吗?

3 个答案:

答案 0 :(得分: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)))

答案 1 :(得分: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 :(得分:0)

您可以根据所需的范围和数据框的大小运行for循环,然后通过转换为factor来计算级别数:

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))
}