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

时间:2015-01-06 15:57:15

标签: r plyr

我的数据框gpri.l具有DBH和记录在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>

&#34;空白&#34;适用于没有树木的地方。我想为每个点制作一个物种表。点99只有Ulmus.alata,点100有1空白,点101有Juniperus.virginana - 3,Ulmus.americana - 2等我可以制作一个带结构的表,但它包括所有37种,包括&#34 ;空白&#34;,在每个点,所以表中每个点都有很多零,因为平均点可能少于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一起工作。我试图考虑如何通过Points对数据框进行子集或拆分,但在我看来,这将涉及编写某种循环。我花了一整天时间试着写一个循环,我甚至无法通过填充一个向量来接收它们。我非常感谢制作表格的一些帮助。并解释我的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 

1 个答案:

答案 0 :(得分:2)

如果您希望将每个点的树计数作为类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

另一方面,如果您乐意将计数存储在数据框中(可能比表格更容易使用),您可以使用ddplysummarise ;按'Point'和'Species'分组,并使用length计算每个'物种'的计数:

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