我的数据框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
函数并得到了相同的结果。
我似乎无法让apply
和table
一起工作。我试图考虑如何通过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
答案 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
另一方面,如果您乐意将计数存储在数据框中(可能比表格更容易使用),您可以使用ddply
和summarise
;按'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