首页 > 解决方案 > 尽管有重复,但分位数削减

问题描述

我有一个包含 > 900,000 行的数据集,其中包含许多重复项:

> sum(duplicated(df$colB))
[1] 904515

因此,当我尝试将分位数切割成十个同样大的子集时,我得到了一个错误

> df$colC <- cut(df$colB, quantile(df$colB,c(0:10)/10), labels=FALSE,
+                   include.lowest=TRUE)
Error in cut.default(df$colB, quantile(df$colB,  : 
  'breaks' are not unique

使用unique(quantile(df$colB,c(0:10)/10))不会给出同样大小的子集。必须有一个简单的解决方案来进行分位数切割,除了colB. 由于我有大量行,因此启动循环序列可能需要很长时间。有任何想法吗?

虚拟数据集:

set.seed(10)
B <- round(runif(100, 0, 0.4), digits=2)  # gives 63 duplicates
df$colB <- B
df <- as.data.frame(df)

标签: r

解决方案


可能有比这更简洁的解决方案,但这会做到:

df$colC <- ceiling((1:nrow(df))*10/nrow(df))[rank(df$colB, ties.method = 'first')]
table(df$colC)
#> 
#>  1  2  3  4  5  6  7  8  9 10 
#> 10 10 10 10 10 10 10 10 10 10

推荐阅读