我进入了林业。 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-输出立场表到增长和产量模拟模型。
答案 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)
您可以使用doBy
和reshape
库。这是您的任务的解决方案。
您也可以使用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)