从数据框架中,我想在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 :(得分: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))
}