【发布时间】:2012-06-04 00:56:52
【问题描述】:
我是 R 新手,我根据需要编写了一些代码来汇总 .csv 文件中的数据。
这里是代码。
raw <- read.csv("trees.csv")
看起来像这样
SNAME CNAME FAMILY PLOT INDIVIDUAL CAP H
1 Alchornea triplinervia (Spreng.) M. Arg. Tainheiro Euphorbiaceae 5 176 15 9.5
2 Andira fraxinifolia Benth. Angelim Fabaceae 3 321 12 6.0
3 Andira fraxinifolia Benth. Angelim Fabaceae 3 326 14 7.0
4 Andira fraxinifolia Benth. Angelim Fabaceae 3 327 18 5.0
5 Andira fraxinifolia Benth. Angelim Fabaceae 3 328 12 6.0
6 Andira fraxinifolia Benth. Angelim Fabaceae 3 329 21 7.0
#add 2 other rows
for (i in 1:nrow(raw)) {
raw$VOLUME[i] <- treeVolume(raw$CAP[i],raw$H[i])
raw$BASALAREA[i] <- treeBasalArea(raw$CAP[i])
}
#来了。 我需要一个新的数据框,其中包含 H 列和 CAP 列的平均值以及 VOLUME 和 BASALAREA 列的总和。此数据框按列 SNAME 分组,并按列 PLOT 分组。
plotSummary = merge(
aggregate(raw$CAP ~ raw$SNAME * raw$PLOT, raw, mean),
aggregate(raw$H ~ raw$SNAME * raw$PLOT, raw, mean))
plotSummary = merge(
plotSummary,
aggregate(raw$VOLUME ~ raw$SNAME * raw$PLOT, raw, sum))
plotSummary = merge(
plotSummary,
aggregate(raw$BASALAREA ~ raw$SNAME * raw$PLOT, raw, sum))
函数 treeVolume 和 treeBasal area 只返回数字。
treeVolume <- function(radius, height) {
return (0.000074230*radius**1.707348*height**1.16873)
}
treeBasalArea <- function(radius) {
return (((radius**2)*pi)/40000)
}
我确信有更好的方法可以做到这一点,但是如何呢?
【问题讨论】:
-
用不那么重复的东西替换丑陋的 4 聚合
-
@user1424495 虽然很高兴看到您尝试了什么,所以我们知道要改进什么,如果您认为您的代码“丑陋”,那么也许您可以用文字告诉我们什么是做。评论
#here comes没有多大帮助。 -
而且,为了使您的代码可重现,我们需要函数
treeVolume和treeBasalArea或它们的调用结果。 -
根据您的上次修订更新了我的答案。希望它比您当前的解决方案更直观和。
标签: r dataframe aggregate summary