【问题标题】:Number of unique values within a range in data-frame数据框中某个范围内的唯一值的数量
【发布时间】:2014-03-18 07:41:59
【问题描述】:

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

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

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    您可以根据您想要的范围和数据框的大小运行 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))
    }
    

    【讨论】:

      【解决方案2】:

      这似乎有效:

      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
      

      【讨论】:

        【解决方案3】:

        您可以使用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 table(data$Groups) 在这一点上也可以正常工作。小心用对象覆盖函数data
        猜你喜欢
        • 2022-01-26
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多