R 数据帧中某个范围内的唯一值数

R 数据帧中某个范围内的唯一值数,r,plyr,R,Plyr,从数据帧中,我想提取Y的特定范围内(例如,每0-100、101-200、201-300等,直到3000)的唯一值(X)的数量 示例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 >

从数据帧中,我想提取Y的特定范围内(例如,每0-100、101-200、201-300等,直到3000)的唯一值(X)的数量

示例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&Y<100)
长度(唯一(垃圾$record.no))

但我必须问问专家们——一定有更好的方法吗?

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

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))
}
范围这似乎有效:

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

您可以使用
by()
cut()

data+1
table(data$Groups)
此时也可以正常工作。使用对象覆盖函数
数据时要小心。
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)))