代码之家  ›  专栏  ›  技术社区  ›  Onur Alkan

R中定量数据的双向频率分布表

  •  0
  • Onur Alkan  · 技术社区  · 8 年前

    我很难为树木直径高度数据建立一个双向频率分布表。我有一个如下的数据集

    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.
    

    所以我有数千行的数据,总结每一个频率本身是一件非常痛苦的事情。我写了以下几行(胸径代表直径,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) ...等

    附言:我是R的新手,所以我的问题可能看起来很愚蠢,但我在这里发帖之前真的翻了互联网。我很抱歉。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Prem    8 年前

    你是说这个吗?在修改了你的代码后我得到了。。。

    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))
    
    推荐文章