r - Cut() 错误 - 'breaks' 不是唯一的

标签 r

我有以下数据框:

 a         
    ID   a.1    b.1     a.2   b.2
1    1  40.00   100.00  NA    88.89
2    2  100.00  100.00  100   100.00
3    3  50.00   100.00  75    100.00
4    4  66.67   59.38   NA    59.38
5    5  37.50   100.00  NA    100.00
6    6  100.00  100.00  100   100.00

当我将以下代码应用于此数据框时:

 temp <- do.call(rbind,strsplit(names(df)[-1],".",fixed=TRUE))
 dup.temp <- temp[duplicated(temp[,1]),]

 res <- lapply(dup.temp[,1],function(i) {
 breaks <- c(-Inf,quantile(a[,paste(i,1,sep=".")], na.rm=T),Inf)
 cut(a[,paste(i,2,sep=".")],breaks)
 })

cut()函数报错:

 Error in cut.default(a[, paste(i, 2, sep = ".")], breaks) : 
 'breaks' are not unique

但是,相同的代码在类似的数据帧上运行得非常好:

 varnames<-c("ID", "a.1", "b.1", "c.1", "a.2", "b.2", "c.2")

 a <-matrix (c(1,2,3,4, 5, 6, 7), 2,7)

 colnames (a)<-varnames

 df<-as.data.frame (a)


    ID  a.1  b.1  c.1  a.2  b.2  c.2
  1  1    3    5    7    2    4    6
  2  2    4    6    1    3    5    7

 res <- lapply(dup.temp[,1],function(i) {
 breaks <- c(-Inf,quantile(a[,paste(i,1,sep=".")], na.rm=T),Inf)
 cut(a[,paste(i,2,sep=".")],breaks)
 })

 res
[[1]]
[1] (-Inf,3] (-Inf,3]
Levels: (-Inf,3] (3,3.25] (3.25,3.5] (3.5,3.75] (3.75,4] (4, Inf]

[[2]]
[1] (-Inf,5] (-Inf,5]
Levels: (-Inf,5] (5,5.25] (5.25,5.5] (5.5,5.75] (5.75,6] (6, Inf]

[[3]]
[1] (5.5,7] (5.5,7]
Levels: (-Inf,1] (1,2.5] (2.5,4] (4,5.5] (5.5,7] (7, Inf]

这个错误的原因是什么? 如何解决? 谢谢。

最佳答案

您收到此错误是因为 b.1a.2b.2 列数据中的分位数值相同对于某些级别,因此它们不能直接用作函数 cut() 中的中断值。

apply(a,2,quantile,na.rm=T)
       ID      a.1    b.1   a.2      b.2
0%   1.00  37.5000  59.38  75.0  59.3800
25%  2.25  42.5000 100.00  87.5  91.6675
50%  3.50  58.3350 100.00 100.0 100.0000
75%  4.75  91.6675 100.00 100.0 100.0000
100% 6.00 100.0000 100.00 100.0 100.0000

解决此问题的一种方法是将 quantile() 放入 unique() 函数中 - 这样您将删除所有不唯一的分位数值。如果分位数不唯一,这当然会减少断点。

res <- lapply(dup.temp[,1],function(i) {
  breaks <- c(-Inf,unique(quantile(a[,paste(i,1,sep=".")], na.rm=T)),Inf)
  cut(a[,paste(i,2,sep=".")],breaks)
})

[[1]]
[1] <NA>        (91.7,100]  (58.3,91.7] <NA>        <NA>        (91.7,100] 
Levels: (-Inf,37.5] (37.5,42.5] (42.5,58.3] (58.3,91.7] (91.7,100] (100, Inf]

[[2]]
[1] (59.4,100]  (59.4,100]  (59.4,100]  (-Inf,59.4] (59.4,100]  (59.4,100] 
Levels: (-Inf,59.4] (59.4,100] (100, Inf]

关于r - Cut() 错误 - 'breaks' 不是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16184947/

相关文章:

r - `.GlobalEnv` 和 `globalenv()` 之间的区别

r - 使用多列作为参数应用函数,函数返回一个 data.frame

r - 带有组的 dplyr 中的 boxplot.stats

r - 使用 geom_tile() 和 facet_wrap() 分配单独的高填充值和低填充值

R:避免summary.plm

r - 如何为不同的插入符号训练模型绘制 AUC ROC?

r - 如何获得数据框中每个组的 10 个最高值?

r - 列出数据集中存在的列的值以及另一列的所有值

r - 使用 dplyr 格式化 summarise_each 中的输出

r - 使用 ggplot2 和plotly 绘制 3D 棱镜