Создание сводной таблицы на основе категорий диапазонов в r

Мои данные в следующем формате:

input<-data.frame(
    region=c("A","T","R","R","T"),
    geomorph=c("F","F","S","S","P"),
    depth=c(2.6,3.5,5.8,6.7,8.9))

> input
  region geomorph depth
1      A        F   2.6
2      T        F   3.5
3      R        S   5.8
4      R        S   6.7
5      T        P   8.9

Я хотел бы создать сводную таблицу, чтобы для заданных категорий глубины (т.е. 0-3,3-6,6-10) количество записей для региона (т.е. A,R,T) и геоморфологии (т.е. F,S ,P) подсчитываются и представляются следующим образом:

output<-data.frame(
    depth.category=c("0-3","3-6","6-10"),
    total=c(1,2,2),
    A=c(1,0,0),
    R=c(0,1,1),
    T=c(0,1,1),
    F=c(1,1,0),
    S=c(0,1,1),
    P=c(0,0,1))

> output
  depth.category total A R T F S P
1            0-3     1 1 0 0 1 0 0
2            3-6     2 0 1 1 1 1 0
3           6-10     2 0 1 1 0 1 1

Любые предложения, как это сделать?


person Elizabeth    schedule 07.02.2013    source источник


Ответы (1)


Сначала просто создайте свои интервалы, используя cut, а затем используйте table и cbind результаты:

intervals <- cut(input$depth, breaks=c(0, 3, 6, 10))

cbind(table(intervals),
      table(intervals, input$region),
      table(intervals, input$geomorph))
#          A R T F P S
# (0,3]  1 1 0 0 1 0 0
# (3,6]  2 0 1 1 1 0 1
# (6,10] 2 0 1 1 0 1 1

Результатом вышеизложенного является matrix. Используйте следующее, если вы хотите data.frame:

temp <- cbind(table(intervals),
      table(intervals, input$region),
      table(intervals, input$geomorph))

temp <- data.frame(depth.category = rownames(temp),
                   as.data.frame(temp, row.names = 1:nrow(temp)))
names(temp)[2] <- "Total"
temp
#   depth.category Total A R T F P S
# 1          (0,3]     1 1 0 0 1 0 0
# 2          (3,6]     2 0 1 1 1 0 1
# 3         (6,10]     2 0 1 1 0 1 1
person A5C1D2H2I1M1N2O1R2T1    schedule 07.02.2013
comment
Спасибо! Мне просто интересно, если глубина равна 3, в какую категорию она будет помещена (0-3 или 3-6), используя ваше решение выше? - person Elizabeth; 07.02.2013
comment
Вы можете попробовать cut(3, breaks=c(0,3,6)) (а затем cut(3, breaks=c(0,3,6), right=FALSE)) и убедиться в этом сами! - person Josh O'Brien; 07.02.2013
comment
Попался. Подводя итог: когда right=TRUE, номер разреза (т.е. 3) включается в более низкую категорию, а когда right=FALSE номер разреза включается в более высокую категорию. Или, куда бы ни указывал ], показывает, к какой категории относится номер разреза. Легко понять, но трудно объяснить (по крайней мере, для меня). - person Elizabeth; 07.02.2013
comment
@ Элизабет -- Верно. Это математическое обозначение для закрытых и открытых интервалов, но я часто просто проверяю чтобы убедиться, что я правильно понял. - person Josh O'Brien; 07.02.2013