R中定量数据的双向频率分布table
Two-way frequency distribution table for a quantitive data in R
我很难为树直径-高度数据创建双向频率分布 table。我有一个如下所示的数据集
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
我需要为此数据创建一个频率分布 table,两列都为 classes。我的 class 界限就像,
直径:
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) 做同样的事情。但问题是如何创建 'cross frequence table'
例如:[6,10)
直径class有35棵树。但是我需要将这35棵树分配到每个高度class。假设这些树中有 12 棵属于 [3,5)
高度 class,其中 8 棵属于 [5,7)
...等等
P.S:我是 R 的新手。所以我的问题可能看起来很虚,但在我 post 到这里之前我真的在网上搜索过。我很抱歉。
你是这个意思吗?调整你的代码后,我得到了...
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))
我很难为树直径-高度数据创建双向频率分布 table。我有一个如下所示的数据集
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
我需要为此数据创建一个频率分布 table,两列都为 classes。我的 class 界限就像,
直径:
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) 做同样的事情。但问题是如何创建 'cross frequence table'
例如:[6,10)
直径class有35棵树。但是我需要将这35棵树分配到每个高度class。假设这些树中有 12 棵属于 [3,5)
高度 class,其中 8 棵属于 [5,7)
...等等
P.S:我是 R 的新手。所以我的问题可能看起来很虚,但在我 post 到这里之前我真的在网上搜索过。我很抱歉。
你是这个意思吗?调整你的代码后,我得到了...
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))