Таблица двустороннего распределения частот для количественных данных в R

У меня возникли трудности с созданием таблицы двустороннего распределения частот для данных диаметра-высоты дерева. У меня есть набор данных, как показано ниже

dbh(cm) tht(m)
3   53.35
19  13.37
27  16.53
22  17.8
9   8.33
10  8.76
24  15.62
44  30.3
17  14.91
10  8.93

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

для диаметра:

8 - 11.9
12 - 15.9
16 - 19.9 and so.

для высоты:

3 - 4.9
5 - 6.9
7 - 8.9 and so.

Итак, у меня есть тысячи строк данных, и суммирование каждой частоты само по себе является полной болью. Я написал следующие строки (dbh обозначает диаметр, а tht — высоту);

> data <- read.csv('data.csv')
> diameter <- data$dbh
> range(diameter)
[1]  6.0 60.5
> breaks <- seq(6, 61, by=4)
> diameter.cut <- cut(diameter, breaks, right = FALSE)
> diameter.frq <- table(diameter.cut)
> cbind(diameter.frq)
        diameter.frq
[6,10)            35
[10,14)           77
[14,18)           59
[18,22)           25
[22,26)           25
[26,30)           51
[30,34)           38
[34,38)           28
[38,42)           21
[42,46)           22
[46,50)           14
[50,54)            2
[54,58)            6
> 

Я могу сделать то же самое с высотой дерева (tht). Но проблема в том, как мне создать «таблицу перекрестных частот»

Например: есть 35 деревьев в классе диаметра [6,10). Но мне нужно распределить эти 35 деревьев по каждому классу высоты. Допустим, 12 из этих деревьев относятся к [3,5) классу высоты, 8 из них к [5,7)...и т.д.

P.S. Я новичок в R. Так что моя проблема может показаться довольно фиктивной, но я действительно покопался в Интернете, прежде чем писать сюда. Сожалею об этом.


person Onur Alkan    schedule 22.05.2018    source источник
comment
Возможный дубликат функции Cut и Table в R   -  person dpel    schedule 22.05.2018


Ответы (1)


Вы имели в виду это? После настройки вашего кода я получил...

library(dplyr)

df %>%
  mutate(diameter.cm = cut(diameter.cm, seq(range(diameter.cm)[1], range(diameter.cm)[2]+4, by=4), right = F),
         height.m = cut(height.m, seq(range(height.m)[1], range(height.m)[2]+2, by=2), right = F)) %>%
  group_by(diameter.cm, height.m) %>%
  tally()

Вывод:

  diameter.cm height.m        n
1 [3,7)       [52.3,54.3)     1
2 [7,11)      [8.33,10.3)     3
3 [15,19)     [14.3,16.3)     1
4 [19,23)     [12.3,14.3)     1
5 [19,23)     [16.3,18.3)     1
6 [23,27)     [14.3,16.3)     1
7 [27,31)     [16.3,18.3)     1
8 [43,47)     [28.3,30.3)     1

Пример данных:

df <- structure(list(diameter.cm = c(3L, 19L, 27L, 22L, 9L, 10L, 24L, 
44L, 17L, 10L), height.m = c(53.35, 13.37, 16.53, 17.8, 8.33, 
8.76, 15.62, 30.3, 14.91, 8.93)), class = "data.frame", row.names = c(NA, 
-10L))
person 1.618    schedule 22.05.2018
comment
Это именно то, что я искал. Работает как часы! Благодарю вас! - person Onur Alkan; 22.05.2018
comment
Рад, что это помогло! - person 1.618; 23.05.2018