R 从作为因子变量的间隔中获取端点

R 从作为因子变量的间隔中获取端点,r,intervals,R,Intervals,设置 我从以下正常混合模型和箱中取样1000000个观察值,使每个10000个箱具有相同数量的观察值(即100)。这将以(a,b]的形式为每个箱子创建一个系数,其中a和b是数字 #Random sample set.seed(1234) X = ks::rnorm.mixt(n=1000000,mus=c(0.2,0.8),sigmas=c(0.04,0.01),props=c(0.95,0.05)) #Bins based on random sample with ~100 observa

设置 我从以下正常混合模型和箱中取样
1000000个观察值,使每个
10000个
箱具有相同数量的观察值(即
100
)。这将以
(a,b]
的形式为每个箱子创建一个系数,其中
a
b
是数字

#Random sample
set.seed(1234)
X = ks::rnorm.mixt(n=1000000,mus=c(0.2,0.8),sigmas=c(0.04,0.01),props=c(0.95,0.05))

#Bins based on random sample with ~100 observations in each bins
bins = ggplot2::cut_number(X,10000)

dat = data.frame(X,bins)
问题 我想从系数
(a,b]
中提取出
a
b
的数字。下面是箱子的外观:

> head(table(bins))
bins
[0.00501617,0.0518875]  (0.0518875,0.0594831]  (0.0594831,0.0640679] 
                   100                    100                    100 
 (0.0640679,0.0670062]  (0.0670062,0.0694194]  (0.0694194,0.0717924] 
                   100                    100                    100 
> tail(table(bins),20)
bins
(0.817766,0.818032]   (0.818032,0.8183]   (0.8183,0.818544] (0.818544,0.818879] 
                100                 100                 100                 100 
(0.818879,0.819112] (0.819112,0.819394] (0.819394,0.819664] (0.819664,0.819979] 
                100                 100                 100                 100 
(0.819979,0.820328] (0.820328,0.820727] (0.820727,0.821118]  (0.821118,0.82158] 
                100                 100                 100                 100 
 (0.82158,0.822109] (0.822109,0.822646] (0.822646,0.823253]  (0.823253,0.82408] 
                100                 100                 100                 100 
 (0.82408,0.825026] (0.825026,0.826417] (0.826417,0.828651]  (0.828651,0.84424] 
                100                 100                 100                 100 
如您所见,系数中的数字并不总是具有相同的位数,它们的前面可能有0(例如
(0.0518875,0.0594831]

我最初尝试使用

endpts=na.omit(as.numeric(unlist(strsplit(as.character(unlist(bins)),"[^0-9]+"))))
对于上述箱子(
(0.0518875,0.0594831)
),此程序将输出
518875 594831
,但由于尾随的零已经消失,它可以被映射到多个值(例如
0.518875 0.594831
)。此外,还有一些箱子,其中一个或两个数字的位数不同(例如
(0.818032,0.8183)
)。这种输出的不一致性给我在尝试获取端点时带来了问题。最终,我希望获取左端点和右端点。有什么建议吗


EDIT我还研究了使用
cut
功能的
ggplot2::cut_number
的代码。在
cut
中,位数的默认输入是
dig.lab=3
,但这似乎没有反映在上述输出中。

我认为您可以利用结构
(a,b)
。我没有尝试使用真实数据,但以下是我的尝试:

s <- c("(0.0518875,0.0594831]", "0.818032,0.8183]")
lapply(strsplit(s, ","), function(x) gsub("\\(|]", "", x))

[[1]]
[1] "0.0518875" "0.0594831" 

[[2]]
[1] "0.818032" "0.8183" 

s我认为您可以利用结构
(a,b]
。我没有尝试使用真实数据,但以下是我的尝试:

s <- c("(0.0518875,0.0594831]", "0.818032,0.8183]")
lapply(strsplit(s, ","), function(x) gsub("\\(|]", "", x))

[[1]]
[1] "0.0518875" "0.0594831" 

[[2]]
[1] "0.818032" "0.8183" 

s这是一种经过简单测试的方法:

unique( as.numeric(  unlist( 
                 strsplit( gsub( "[][(]" , "", levels(bins)[1:5] ) , ","))))
我已经学会了“从内到外读取嵌套的R代码”。首先(1)使用字符类模式删除旁边的“(”、“[”和“]”,然后(2)在逗号上拆分,(3)使用
unlist将列表结构“矢量化”,(4)然后转换为数字,最后(5)删除重复项。这显示它使用换行符进行格式设置:

unique(                    #     (5)
  as.numeric(                  #     (4)
      unlist(                        #     (3)
            strsplit(                     #     (2)
                gsub( "[][(]" , "", levels(bins)[1:5] ) , ",") # (1)
       )))
这在您的示例上进行了测试,并使用前5个级别为一个较小的示例生成:

unique( as.numeric(  unlist( strsplit( gsub( "[][(]" , "", levels(bins)[1:5] ) , ","))))
[1] 0.00501617 0.05188750 0.05948310 0.06406790 0.06700620 0.06941940
我把“vectorizes”这个词放在引号里,因为它在R术语中并不是真正的意思,它指的是返回一个长度相等的向量作为输入的操作

以下是我的建议的结果,即在未用作拆分标准的项目中保留小数点(句点),并与我的代码将提供的内容相一致。您不清楚是只需要唯一值还是每个项目的值:

endpts= na.omit( as.numeric( unlist( strsplit( as.character( unlist(bins)),"[^0-9.]+"))))

 head(endpts)
#[1] 0.216698 0.216709 0.243665 0.243682 0.201100 0.201114
 end2 <- unique( as.numeric(  unlist( strsplit( gsub( "[][(]" , "", levels(bins) ) , ","))))
head(end2)
#[1] 0.00501617 0.05188750 0.05948310 0.06406790 0.06700620 0.06941940
 length(endpts)
#[1] 2000000
 length(end2)
#[1] 10001
endpts=na.omit(如.numeric(如.character(如.character(如.bins)),“[^0-9.]+”))))
总目(完)
#[1] 0.216698 0.216709 0.243665 0.243682 0.201100 0.201114

end2这是一种经过简单测试的方法:

unique( as.numeric(  unlist( 
                 strsplit( gsub( "[][(]" , "", levels(bins)[1:5] ) , ","))))
我已经学会了“从内到外读取嵌套的R代码”。首先(1)使用字符类模式删除旁边的“(”、“[”和“]”,然后(2)在逗号上拆分,(3)使用
unlist将列表结构“矢量化”,(4)然后转换为数字,最后(5)删除重复项。这显示它使用换行符进行格式设置:

unique(                    #     (5)
  as.numeric(                  #     (4)
      unlist(                        #     (3)
            strsplit(                     #     (2)
                gsub( "[][(]" , "", levels(bins)[1:5] ) , ",") # (1)
       )))
这在您的示例上进行了测试,并使用前5个级别为一个较小的示例生成:

unique( as.numeric(  unlist( strsplit( gsub( "[][(]" , "", levels(bins)[1:5] ) , ","))))
[1] 0.00501617 0.05188750 0.05948310 0.06406790 0.06700620 0.06941940
我把“vectorizes”这个词放在引号里,因为它在R术语中并不是真正的意思,它指的是返回一个长度相等的向量作为输入的操作

以下是我的建议的结果,即在未用作拆分标准的项目中保留小数点(句点),并与我的代码将提供的内容相一致。您不清楚是只需要唯一值还是每个项目的值:

endpts= na.omit( as.numeric( unlist( strsplit( as.character( unlist(bins)),"[^0-9.]+"))))

 head(endpts)
#[1] 0.216698 0.216709 0.243665 0.243682 0.201100 0.201114
 end2 <- unique( as.numeric(  unlist( strsplit( gsub( "[][(]" , "", levels(bins) ) , ","))))
head(end2)
#[1] 0.00501617 0.05188750 0.05948310 0.06406790 0.06700620 0.06941940
 length(endpts)
#[1] 2000000
 length(end2)
#[1] 10001
endpts=na.omit(如.numeric(如.character(如.character(如.bins)),“[^0-9.]+”))))
总目(完)
#[1] 0.216698 0.216709 0.243665 0.243682 0.201100 0.201114

end2我不认为有必要使用
lappy
。我不认为有必要使用
lappy
。如果保留小数点,代码成功的几率会更大。如果保留小数点,代码成功的几率会更大。