Биннинг разной длины в R - PullRequest
0 голосов
/ 04 августа 2011

input1

dput(a1  100 200 +
a1  250 270 +
a1  333 340 -
a2  450 460 +)

input2

dput(a1  101 106 +
a1  112 117 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  258 259 +
a1  260 262 +
a1  260 262 + 
a1  260 262 + 
a1  260 262 + 
a1  260 262 + 
a1  332 333 -
a1  332 333 -
a1  332 333 -
a1  332 333 -
a1  332 333 -
a1  332 333 -
a1  332 333 -
a1  331 333 -
a1  331 333 -
a1  331 333 -
a1  331 333 -
a1  331 333 -
a1  331 333 -)

output

c   s   e   st  1   2   3   4   5   6   7   8   9   10
a1  100 200 +   1   2   0   0   0   0   0   0   0   0
a1  250 270 +   0   0   0   9   5   0   0   0   0   0
a1  330 340 -   0   0   0   0   0   0   0   6   7   0
a2  450 460 +   0   0   0   0   0   0   0   0   0   0

Я хочу посчитать плотность точек (input2), используя значения input1.Означает, что a1-100-200 имеет сколько очков в этом диапазоне от 100 до 200?т.е. 3. И я хочу сделать то же самое для всех входных значений.И я хочу сравнить друг друга.Но проблема в том, что длина значений (200-100 = 100 или 270-250 = 20) различна.Чтобы сравнить их друг с другом, мне нужно масштабировать их так, чтобы я мог их сравнить.Итак, я придумал окно с 10 ячейками (вывод).Я рассчитываю точки input2, используя входные лотки.Наконец, мне нужно построить ячейки на оси x и значения на оси y xyplot (x (ячейки), y1 (a1: 100: 200: +) + y2 (a1: 250: 270: + y3 ... + y4)

"+" означает, что мы должны принять 100 в качестве начальной точки и 200 в качестве конечной точки при расчете бинов (100-110 будет 1-ым бином .....) - означает с точностью до наоборот (190-200 будетпервая ячейка)

1-10 означает ячейки от 1 до 10

вам нужно использовать столбцы 1 и 2 для ключа на основе столбца 1. Мы удаляем эти значения, которые не находятся в диапазоне

c = символ, s = начало, e = конец, s = нить, 1-10 - ячейки ввода 1. да, вы правы и разбиты. Например, 250-270 должны иметь разность 2 чисел, потому что (270-250= 20, поэтому для 10 бинов это будет 20/10 = 2)

1 Ответ

1 голос
/ 04 августа 2011

Вопрос все еще не очень хорошо сформулирован, поэтому я не уверен, что полностью понял, что вы хотите, но вы, вероятно, хотите использовать комбинацию table и cut.

Вашпример данных

input1 <- data.frame(
  type  = paste("a", rep(1:2, times = c(3, 1)), sep = ""),
  lower = c(100, 250, 333, 450),
  upper = c(200, 270, 340, 460)
)

input2 <- data.frame(
  type = rep.int("a1", 28),
  lower = rep(c(101, 112, 258, 260, 332, 331), times = c(1, 1, 9, 5, 7, 5)),
  upper = rep(c(106, 117, 259, 262, 333), times = c(1, 1, 9, 5, 12))
)

Сначала вы определяете ячейки на основе значений в input1.

cut_points <- with(input1, sort(c(start, end)))

Затем разбиваете input2$start по типу, делите его на ячейки и находите счетв каждом.

with(input2, tapply(start, type, function(x) table(cut(x, cut_points))))

Возможно, повторите с колонкой end.

with(input2, tapply(end, type, function(x) table(cut(x, cut_points))))
...