我试图根据指定的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
也许任何提示或想法都会受到高度赞赏。提前谢谢!
答案 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