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
我正在尝试根据指定的 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