R:根据树计数数据框制作多个表格

标签 r plyr

我的数据框 gpri.l 记录了 188 个点的树木胸径和状态。这是一个示例:

   Point              Species DBH..cm. Live.Dead Distance..m.
1     99          Ulmus.alata     12.6         L         <NA>
2    100                Blank    Blank     Blank         <NA>
3    101 Juniperus.virginiana     29.4         L         <NA>
4    101 Juniperus.virginiana     15.6         L         <NA>
5    101 Juniperus.virginiana      5.2         L         <NA>
6    101      Ulmus.americana      8.8         L         <NA>
7    101      Ulmus.americana      4.2         L         <NA>
10   102    Carya.cordiformis     22.4         L         <NA>

“空白”是指没有树木的点。我想为每个点制作一个物种表。点 99 只有 Ulmus.alata,点 100 有 1 个 Blank,点 101 有 Juniperus.virginana - 3,Ulmus.americana - 2 等。我可以用 structable 制作一个表格,但它包括所有 37 个物种,包括“Blank” ,在每个点中,因此表中每个点都有很多零,因为平均点可能少于 6 个物种。我尝试过 plyr 中的函数,例如

library(plyr)
ddply(gpri.l,.(Point),table(Species))
# Error in table(Species) : object 'Species' not found

ddply(gpri.l,.(Point),table("Species"))
# Error in llply(.data = pieces, .fun = .fun, ..., .progress = .progress,  : 
#   .fun is not a function.

我不知道为什么会发生这些错误。我还尝试了 dlply 函数,得到了相同的结果。

我似乎无法让 applytable 一起工作。我试图考虑如何按点对数据帧进行子集化或分割,但在我看来,这将涉及编写某种循环。我花了一整天的时间试图编写一个循环,但我什至无法获取点来填充设置为接收它们的向量。我真的很感激一些制作 table 的帮助。以及我的 plyr 错误的解释。

在 Henrik 回答后进行编辑--

@Henrik 我尝试了你的第一个建议,但它对我来说并不像对你那样有效。您的评论显示了我正在寻找的内容,但我已经复制并粘贴了它对我来说的样子。

> h.h<-dlply(gpri.l, .(Point), function(x) table(x$Species))
> head(h.h)
$`99`

                 Blank      Carya.cordiformis    Carya.illinoisensis               Carya.sp 
                     0                      0                      0                      0 
          Carya.texana        Carya.tomentosa       Celtis.laevigata    Celtis.occidentalis 
                     0                      0                      0                      0 
            Celtis.sp.      Cercis.canadensis             Cornus.sp.   Diospyros.virginiana 
                     0                      0                      0                      0 
 Fraxinus.pensylvanica           Fraxinus.sp.  Gleditsia.triacanthos          Juglans.nigra 
                     0                      0                      0                      0 
  Juniperus.virginiana       Maclura.pomifera               Morus.sp Plantanus.occidentalis 
                     0                      0                      0                      0 
      Prunus.americana        Prunus.serotina             Prunus.sp.     Quercus.macrocarpa 
                     0                      0                      0                      0 
   Quercus.marilandica   Quercus.muhlenbergii          Quercus.rubra             Quercus.sp 
                     0                      0                      0                      0 
      Quercus.stellata       Quercus.velutina   Robinia.pseudoacacia     Sapindus.saponaria 
                     0                      0                      0                      0 
             Sassafras   Sideroxylon.lanigosa            Ulmus.alata        Ulmus.americana 
                     0                      0                      1                      0 

$`100`

                 Blank      Carya.cordiformis    Carya.illinoisensis               Carya.sp 
                     1                      0                      0                      0 
          Carya.texana        Carya.tomentosa       Celtis.laevigata    Celtis.occidentalis 

最佳答案

如果您希望将每个点的树计数作为 table 类返回,则需要将 dlply 与匿名函数一起使用。这将生成一个每个点一个元素的列表,每个元素包含一个表:

dlply(df, .(Point), function(x) table(x$Species))
# $`99`
# 
# Ulmus.alata 
#           1 
# 
# $`100`
# 
# Blank 
#     1 
# 
# $`101`
# 
# Juniperus.virginiana      Ulmus.americana 
#                    3                    2 
# 
# $`102`
# Carya.cordiformis 
#                 1

另一方面,如果您愿意将计数存储在数据框中(可能比表格更容易使用),您可以使用 ddply总结;按“点”和“物种”分组,并计算每个“物种”的数量,长度:

ddply(df, .(Point, Species), summarise, count = length(Species))
#   Point              Species count
# 1    99          Ulmus.alata     1
# 2   100                Blank     1
# 3   101 Juniperus.virginiana     3
# 4   101      Ulmus.americana     2
# 5   102    Carya.cordiformis     1

您还可以查看等效的 dplyr 代码:

library(dplyr)
df %>%
  group_by(Point, Species) %>%
  summarise(count = n())
#   Point              Species count
# 1    99          Ulmus.alata     1
# 2   100                Blank     1
# 3   101 Juniperus.virginiana     3
# 4   101      Ulmus.americana     2
# 5   102    Carya.cordiformis     1

关于R:根据树计数数据框制作多个表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27802317/

相关文章:

r - 绘制 PCA 的所有组件

r - 按组按降序连接值

r - 在 lapply 中增加多个参数

R - Corrplot() 相关矩阵在网格中有问号。如何理解矩阵?

r - 如何使用 felm() 指定工具变量模型?

r - 为什么 `ceiling` 和 `floor` 的默认返回类型是数字?

r - ddply聚合列名

r - 对多个测试的观察结果进行分组

R Plyr - 从 DDPLY 订购结果?

r - 使用 R 和 purrr 通过 pmap 使用列表列表来连接多个数据帧