Объединение данных в R

#r #binning

#r #объединение

Вопрос:

У меня есть вектор с примерно 4000 значениями. Мне просто нужно было бы разделить их на 60 равных интервалов, для которых затем мне пришлось бы вычислять медиану (для каждого из бинов).

 v<-c(1:4000)
  

V — это действительно просто вектор. Я читал о cut, но для этого мне нужно указать точки останова. Я просто хочу 60 равных интервалов

Комментарии:

1. Просто примечание: вы можете писать v <- 1:4000 , c() в этом случае в этом нет необходимости.

2. 4000 не делится поровну на 60

Ответ №1:

Использование cut и tapply :

 > tapply(v, cut(v, 60), median)
          (-3,67.7]          (67.7,134]           (134,201]           (201,268] 
               34.0               101.0               167.5               234.0 
          (268,334]           (334,401]           (401,468]           (468,534] 
              301.0               367.5               434.0               501.0 
          (534,601]           (601,668]           (668,734]           (734,801] 
              567.5               634.0               701.0               767.5 
          (801,867]           (867,934]         (934,1e 03]    (1e 03,1.07e 03] 
              834.0               901.0               967.5              1034.0 
(1.07e 03,1.13e 03]  (1.13e 03,1.2e 03]  (1.2e 03,1.27e 03] (1.27e 03,1.33e 03] 
             1101.0              1167.5              1234.0              1301.0 
 (1.33e 03,1.4e 03]  (1.4e 03,1.47e 03] (1.47e 03,1.53e 03]  (1.53e 03,1.6e 03] 
             1367.5              1434.0              1500.5              1567.0 
 (1.6e 03,1.67e 03] (1.67e 03,1.73e 03]  (1.73e 03,1.8e 03]  (1.8e 03,1.87e 03] 
             1634.0              1700.5              1767.0              1834.0 
(1.87e 03,1.93e 03]    (1.93e 03,2e 03]    (2e 03,2.07e 03] (2.07e 03,2.13e 03] 
             1900.5              1967.0              2034.0              2100.5 
 (2.13e 03,2.2e 03]  (2.2e 03,2.27e 03] (2.27e 03,2.33e 03]  (2.33e 03,2.4e 03] 
             2167.0              2234.0              2300.5              2367.0 
 (2.4e 03,2.47e 03] (2.47e 03,2.53e 03]  (2.53e 03,2.6e 03]  (2.6e 03,2.67e 03] 
             2434.0              2500.5              2567.0              2634.0 
(2.67e 03,2.73e 03]  (2.73e 03,2.8e 03]  (2.8e 03,2.87e 03] (2.87e 03,2.93e 03] 
             2700.5              2767.0              2833.5              2900.0 
   (2.93e 03,3e 03]    (3e 03,3.07e 03] (3.07e 03,3.13e 03]  (3.13e 03,3.2e 03] 
             2967.0              3033.5              3100.0              3167.0 
 (3.2e 03,3.27e 03] (3.27e 03,3.33e 03]  (3.33e 03,3.4e 03]  (3.4e 03,3.47e 03] 
             3233.5              3300.0              3367.0              3433.5 
(3.47e 03,3.53e 03]  (3.53e 03,3.6e 03]  (3.6e 03,3.67e 03] (3.67e 03,3.73e 03] 
             3500.0              3567.0              3633.5              3700.0 
 (3.73e 03,3.8e 03]  (3.8e 03,3.87e 03] (3.87e 03,3.93e 03]    (3.93e 03,4e 03] 
             3767.0              3833.5              3900.0              3967.0
  

Комментарии:

1. 1 это самое простое решение, которое я всегда использую при объединении данных

2. как можно построить привязанный вектор к уровням?

3. @morpheus Извините, это действительно старый ответ для меня, поэтому я не понимаю вашего вопроса.

Ответ №2:

В прошлом я уже использовал эту функцию

 evenbins <- function(x, bin.count=10, order=T) {
    bin.size <- rep(length(x) %/% bin.count, bin.count)
    bin.size <- bin.size   ifelse(1:bin.count <= length(x) %% bin.count, 1, 0)
    bin <- rep(1:bin.count, bin.size)
    if(order) {    
        bin <- bin[rank(x,ties.method="random")]
    }
    return(factor(bin, levels=1:bin.count, ordered=order))
}
  

и тогда я могу запустить его с

 v.bin <- evenbins(v, 60)
  

и проверьте размеры с помощью

 table(v.bin)
  

и посмотрите, что все они содержат 66 или 67 элементов. По умолчанию это упорядочит значения точно так же, как cut будет, поэтому каждый из уровней фактора будет иметь возрастающие значения. Если вы хотите объединить их в соответствии с их первоначальным порядком,

 v.bin <- evenbins(v, 60, order=F)
  

вместо этого. Это просто разделит данные в том порядке, в котором они отображаются

Комментарии:

1. не могли бы вы просто кратко рассказать о том, как я вычисляю среднее значение для каждой ячейки, а затем добавляю его в отдельный вектор??

2. Если у вас есть фактор ячеек, вы бы использовали v.bin.means <- tapply(v, v.bin, mean)

3. я делаю это для двух векторов и получаю векторы со средними значениями (после шага tapply). Они оба имеют одинаковую длину, и я хотел бы использовать 1 вектор в качестве оси x. Я попробовал построить график (vec1, vec2, type=»l»), но затем я получаю несколько строк…

4. @user3419669 Это звучит как другая проблема. Если у вас есть новый вопрос, вам следует запустить другой поток, чтобы другие тоже могли это сделать.

Ответ №3:

Этот результат показывает 59 средних значений точек останова. Значения 60 ячеек, вероятно, максимально близки к равным (но, вероятно, не совсем равны).

 > sq <- seq(1, 4000, length = 60)
> sapply(2:length(sq), function(i) median(c(sq[i-1], sq[i])))
# [1]   34.88983  102.66949  170.44915  238.22881  306.00847  373.78814
# [7]  441.56780  509.34746  577.12712  644.90678  712.68644  780.46610
#  ......
  

На самом деле, после проверки, ячейки чертовски близки к равным.

 > unique(diff(sq))
# [1] 67.77966 67.77966 67.77966