如何根据物种将树木直径列表转换为频率

时间:2015-11-03 13:53:03

标签: r reshape

我进入了林业。 R相对较新;使用read.csv,[,],名称,ifelse,更改变量类型,进行简单计算,rbind数据帧,这种东西。

我有一个数据框,其中包含按物种列出的树木直径(2厘米等级:2,4,6,8等)的结果。因此,每个物种都有一个变量,每个地块的线数和最常见物种中的树数一样多。地块分为林分。绘图编号不是唯一的,因为它可以出现在其他展位中。以下是一个特定情节的示例:

Stand      Plot    SM    RM    YB    WB    Others  
108504     1       2     6     12    32    24  
108504     1       8     8     10    
108504     1       8     8     12  
108504     1       8     4     8  
...

我想要转换该数据帧,以便每个绘图有一行,并且物种和直径的每个组合成为包含该直径和物种的树数的新变量。这就是我希望这样出现的方式:

Stand      Plot    SM2    SM8    RM4    RM6    RM8    YB8    YB10    YB12    WB32    Others24  
108504     1       1      3      1      1      2      1      1       2       1       1

我想我首先需要按直径,按地块,按立场计算频率。我猜,我需要做一组叠加的应用类循环。不过不知道该怎么做。在那之后,我想我需要生成新的变量名称,其中将放置这些频率的结果。谢谢你的帮助。

根据收到的意见,我可以补充一点,其用途主要是: 1-通过绘图计算密度和基础面积(总和和物种) 每个图的2-输出立场表到增长和产量模拟模型。

2 个答案:

答案 0 :(得分:1)

这是一种以长(而不是宽)格式获取数据的方法:

dat <-read.table(text="Stand      Plot    SM    RM    YB    WB    Others  
108504     1       2     6     12    32    24  
108504     1       8     8     10   0 0
108504     1       8     8     12  0 0
108504     1       8     4     8 0 0", header=T)

library(reshape2)

dat$line_id <- 1:nrow(dat) #you can do without, but I like to save this

#melt
m_dat <- melt(dat, id.var=c("Stand","Plot","line_id"),
              variable.name="species",value.name="diameter")

m_dat <- m_dat[m_dat$diameter!=0,] #artefact of reading in data...

#aggregate again (if necessary, based on counts)
res <- dcast(m_dat, Stand+Plot+species+diameter~"count",value.var="diameter",fun.agg=length)
> res
    Stand Plot species diameter count
1  108504    1      SM        2     1
2  108504    1      SM        8     3
3  108504    1      RM        4     1
4  108504    1      RM        6     1
5  108504    1      RM        8     2
6  108504    1      YB        8     1
7  108504    1      YB       10     1
8  108504    1      YB       12     2
9  108504    1      WB       32     1
10 108504    1  Others       24     1

答案 1 :(得分:0)

您可以使用doByreshape库。这是您的任务的解决方案。 您也可以使用dplyR执行此操作。

library(doBy); library(reshape)
# Create a test data frame
data.df <- data.frame(Stand = rep(c(108504,108505), each = 10),
                   Plot = rep(c(1,2)),
                   SM = round(runif(10,1,10),0),
                   RM = round(runif(10,1,10),0),
                   YB = round(runif(10,1,10),0))

#first melt the data
data <- melt(data.df, id = c("Stand","Plot"))

# create an ID for class (tree species + dbh class
data$Tree_ID <- paste(data$variable, data$value, sep = "_")

# make the summary of the data using length
data <- summaryBy(value ~ Stand + Plot + Tree_ID, data = data, FUN = length, keep.names = T)

# transform it back to the format you need
data <- cast(data, Stand + Plot ~ Tree_ID, vaue = value)