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

时间:2015-06-09 17:05:11

标签: r bin

我试图根据指定的bin大小重复向数字向量添加“固定数字”。但是,“固定数量”取决于数据范围。

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

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次功能(因为我的箱数是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

也许任何提示或想法都会受到高度赞赏。提前谢谢!

2 个答案:

答案 0 :(得分:1)

经过几个小时的尝试,设法回答了我自己的问题,所以我想分享一下。我使用了包&#34; binr &#34;并且包中的函数称为&#34; bins&#34;获得所需的垃圾箱。请在下面找到我尝试回答我的问题,它与预期的输出略有不同但是为了我的目的它仍然没问题

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

请原谅我糟糕的代码,如果有更好的方法,请分享。如果有人可以评论如何将其包装成函数,那将会很好。

答案 1 :(得分:1)

这可能对基地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