R:从树计数的数据框中制作几个表格

R: make several tables from data frame of tree counts

我的数据框 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>

"Blank" 适用于没有树木的点。我想为每个点制作 table 个物种。第 99 点只有 Ulmus.alata,第 100 点有 1 个空白,第 101 点有 Juniperus.virginana - 3,Ulmus.americana - 2,等等。我可以用 struc[= 制作一个 table 28=],但它包含所有 37 个物种,包括每个点的 "Blank",因此 table 每个点都有很多零,因为平均点可能少于 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)

我的数据框 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>

"Blank" 适用于没有树木的点。我想为每个点制作 table 个物种。第 99 点只有 Ulmus.alata,第 100 点有 1 个空白,第 101 点有 Juniperus.virginana - 3,Ulmus.americana - 2,等等。我可以用 struc[= 制作一个 table 28=],但它包含所有 37 个物种,包括每个点的 "Blank",因此 table 每个点都有很多零,因为平均点可能少于 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 我尝试了你的第一个建议,但它对我没有用,就像对你一样。您的评论显示了我一直在寻找的内容,但我已经复制并粘贴了它看起来像我的内容。

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 

我的数据框 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>

"Blank" 适用于没有树木的点。我想为每个点制作 table 个物种。第 99 点只有 Ulmus.alata,第 100 点有 1 个空白,第 101 点有 Juniperus.virginana - 3,Ulmus.americana - 2,等等。我可以用 struc[= 制作一个 table 28=],但它包含所有 37 个物种,包括每个点的 "Blank",因此 table 每个点都有很多零,因为平均点可能少于 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 我尝试了你的第一个建议,但它对我没有用,就像对你一样。您的评论显示了我一直在寻找的内容,但我已经复制并粘贴了它看起来像我的内容。

100`

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

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

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

另一方面,如果您愿意将计数存储在数据框中(可能比table更容易使用),您可以使用ddplysummarise;按 'Point' 和 'Species' 分组,并用 length:

计算每个 'Species' 的计数
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