R:根据数据范围创建特定的bin

R : Create specific bin based on data range

我正在尝试根据指定的 bin 大小将 "fixed number" 重复添加到数值向量。但是,"fixed number" 取决于数据范围。

例如;我的数据范围是 10 到 1010,我希望将数据分成 100 个 bin。因此理想情况下,数据看起来像这样

Since 1010 - 10 = 1000
And 1000 / 100(The number of bin specified) = 10
Therefore the ideal data would look like this
bin1 - 10 (initial data)  
bin2 - 20 (initial data + 10)  
bin3 - 30 (initial data + 20)  
bin4 - 40 (initial data + 30)    
bin100 - 1010 (initial data + 1000) 

现在实际数据稍微复杂一些,不是只有一个数据范围而是多个数据范围,希望下面的例子能说明问题

# Some fixed values
start <- c(10, 5000, 4857694)
end <- c(1010, 6500, 4897909)

理想情况下,我希望得到类似

的东西
10  20
20  30
30  40
..   ..
5000  5015
5015  5030
5030  5045
..   ..
4857694   4858096 # Note theoretically it would have decimal places, 
#but i do not want any decimal place
4858096   4858498
..   ..

到目前为止我一直在考虑这种功能,但它似乎效率低下,因为;
1) 我必须重新输入函数 100 次(因为我的 bin 数是 100)
2) 我找不到一种方法来沿着我的值重复函数——换句话说,我的函数只能处理数据 10-1010 而不是下一个 5000-6500

# The range of the variable
width <- end - start
# The bin size (Number of required bin)
bin_size <- 100
bin_count <- width/bin_size
# Create a function
f1 <- function(x,y){
c(x[1],
x[1] + y[1], 
x[1] + y[1]*2,
x[1] + y[1]*3)
}

f1(x= start,y=bin_count)
f1
[1] 10 20 30 40

如果有任何提示或想法,我们将不胜感激。提前致谢!

经过几个小时的尝试,终于回答了我自己的问题,所以我想分享一下。我使用包“binr”和包中名为"bins"的函数来获取所需的bin。请在下面找到我尝试回答我的问题的尝试,它与预期的输出略有不同,但就我的目的而言它仍然没问题

library(binr)
# Some fixed values
start <- c(10, 5000, 4857694)
end <- c(1010, 6500, 4897909)

tmp_list_start <- list() # Create an empty list

# This just extract the output from "bins" function into a list
for (i in seq_along(start)){
  tmp <- bins(start[i]:end[i],target.bins = 100,max.breaks = 100)
  # Now i need to convert one of the output from bins into numeric value
  s <- gsub(",.*", "", names(tmp$binct))
  s <- gsub("\[","",s)
  tmp_list_start[[i]] <- as.numeric(s)
}  

# Repeating the same thing with slight modification to get the end value of the bin
tmp_list_end <- list()
for (i in seq_along(end)){
  tmp <- bins(start[i]:end[i],target.bins = 100,max.breaks = 100)
  e <- gsub(".*,", "", names(tmp$binct))
  e <- gsub("]","",e)
  tmp_list_end[[i]] <- as.numeric(e)
}

v1 <- unlist(tmp_list_start)
v2 <- unlist(tmp_list_end)

df <- data.frame(start=v1, end=v2)
head(df)
  start end
1    10  20
2    21  30
3    31  40
4    41  50
5    51  60
6    61  70

请原谅我糟糕的代码,如果有更好的方法请分享。如果有人可以评论如何将其包装到函数中,那就太好了..

这里有一个方法可能对基础有帮助 R:

bin_it <- function(START, END, BINS) {
  range <- END-START
  jump <- range/BINS
  v1 <- c(START, seq(START+jump+1, END, jump))
  v2 <- seq(START+jump-1, END, jump)+1
  data.frame(v1, v2)
}

它使用函数 seq 创建指向结尾数字的数字向量。它可能不适用于所有情况,但对于您提供的范围,它应该提供所需的输出。

bin_it(10, 1010)
      v1   v2
1     10   20
2     21   30
3     31   40
4     41   50
5     51   60

bin_it(5000, 6500)
      v1   v2
1   5000 5015
2   5016 5030
3   5031 5045
4   5046 5060
5   5061 5075

bin_it(4857694, 4897909)
         v1      v2
1   4857694 4858096
2   4858097 4858498
3   4858499 4858900
4   4858901 4859303
5   4859304 4859705
6   4859706 4860107