2016-08-15 2 views
0

Я хотел бы связать каждый элемент числового вектора с серединой его бункера, используя бит в k равных ширины.Получите средние точки с одинаковыми ячейками

ggplot2::cut_interval может производить опоры с одинаковой шириной, а Hmisc::cut2 может обеспечить среднюю точку, но я не вижу способа сделать это вместе.

Минимальный воспроизводимый пример:

v <- c(1, 2, 7, 9) 

# cut_interval gives equal-width bins, but no midpoints. 
ggplot2::cut_interval(v, 2) 
# [1] [1,5] [1,5] (5,9] (5,9] 
# Levels: [1,5] (5,9] 

# cut2 doesn't give equal-width bins. 
Hmisc::cut2(v, g=2) 
# [1] [1,7) [1,7) [7,9] [7,9] 
# Levels: [1,7) [7,9] 

# But it returns the midpoint. 
Hmisc::cut2(v, g=2, levels.mean=T) 
# [1] 1.5 1.5 8.0 8.0 
# Levels: 1.5 8.0 

# Which can be extracted as a numeric. 
as.numeric(as.character(Hmisc::cut2(v, g=2, levels.mean=T))) 
# [1] 1.5 1.5 8.0 8.0 

ответ

2

Если вы хотите автоматически выбранные элементы дискретизации, просто используйте hist(). Он предоставляет несколько алгоритмов для того, как выбран binwidths:

set.seed(47) 
h1 = hist(rnorm(100)) 
h1$breaks 
# [1] -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 
h1$mids 
# [1] -2.25 -1.75 -1.25 -0.75 -0.25 0.25 0.75 1.25 1.75 2.25 

Если вы хотите добавить биннинг к данным, используйте cut с перерывами, предусмотренных hist. Чтобы добавить только средние точки, вы можете сделать cut(my_data, breaks = h1$breaks, labels = h1$mids).

На ваших данных:

v <- c(1, 2, 7, 9) 
h2 = hist(v) 
h2$breaks 
# [1] 0 2 4 6 8 10 
h2$mids 
# [1] 1 3 5 7 9 

Объект hist также другую полезную информацию, то count, то density. Вы можете установить plot = FALSE, если вы не хотите, чтобы график всплывал, и см. ?hist для многих других опций.

0

Вы можете извлечь верхние и нижние границы от каждого cut_interval бункера:

EqualWidthBinMidpoint <- function(x, k) { 
    # Returns midpoints of equal-width bins. 
    # 
    # Args: 
    # x: Vector to bin. 
    # k: Number of bins. 
    # 
    # Returns: 
    # Numeric vector with midpoint of each element of x's bin. 
    ci <- as.character(ggplot2::cut_interval(x, k)) 
    ci2 <- substr(as.character(ci), 2, nchar(as.character(ci)) - 1) 
    lb <- sapply(ci2, function(x) strsplit(x, ",")[[1]][1]) 
    ub <- sapply(ci2, function(x) strsplit(x, ",")[[1]][2]) 
    return((as.numeric(lb) + as.numeric(ub))/2) 
} 

EqualWidthBinMidpoint(v, 2) 
# [1] 3 3 7 7 
Смежные вопросы