1

私は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およびtreeBasalareaは、数値を返すだけです。

treeVolume <- function(radius, height) {
  return (0.000074230*radius**1.707348*height**1.16873)
}

treeBasalArea <- function(radius) {
  return (((radius**2)*pi)/40000)
}

これを行うためのより良い方法があると確信していますが、どうすればよいですか?

4

2 に答える 2

2

私はあなたのサンプルデータを読み取ることができませんが、一般的にそれを表すものを作成したと思います...だから、これを試してみてください. この回答は、 plyr とddplydata.frame のセグメントごとにグループ化しnumcolwise、関心のある統計を計算する関数を調べるという Greg の提案に基づいています。

#Sample data
set.seed(1)
dat <- data.frame(sname = rep(letters[1:3],2), plot = rep(letters[1:3],2), 
                  CAP = rnorm(6), 
                  H = rlnorm(6), 
                  VOLUME = runif(6),
                  BASALAREA = rlnorm(6)
                  )


#Calculate mean for all numeric columns, grouping by sname and plot
library(plyr)
ddply(dat, c("sname", "plot"), numcolwise(mean))
#-----
  sname plot        CAP        H    VOLUME BASALAREA
1     a    a  0.4844135 1.182481 0.3248043  1.614668
2     b    b  0.2565755 3.313614 0.6279025  1.397490
3     c    c -0.8280485 1.627634 0.1768697  2.538273

編集 - 更新された質問への回答

わかりました-あなたの質問は多かれ少なかれ再現可能です。これが私がそれに取り組む方法です。まず、R がベクトル化されているという事実を利用できます。つまり、各行をループすることなく、1 回のパスで VOLUME と BASALAREA のすべての値を計算できます。そのビットについては、次のtransform関数をお勧めします。

dat <- transform(dat, VOLUME = treeVolume(CAP, H), BASALAREA = treeBasalArea(CAP))

次に、CAP と H、次に VOLUME と BASALAREA の異なる統計を計算するつもりであることを理解した上で、次のsummarizeように関数を使用することをお勧めします。

ddply(dat, c("sname", "plot"), summarize,
  meanCAP = mean(CAP),
  meanH = mean(H),
  sumVOLUME = sum(VOLUME),
  sumBASAL = sum(BASALAREA)
  )

次のような出力が得られます。

  sname plot   meanCAP     meanH    sumVOLUME     sumBASAL
1     a    a 0.5868582 0.5032308 9.650184e-06 7.031954e-05
2     b    b 0.2869029 0.4333862 9.219770e-06 1.407055e-05
3     c    c 0.7356215 0.4028354 2.482775e-05 8.916350e-05

のヘルプ ページは?ddply, ?transform, ?summarize洞察に満ちている必要があります。

于 2012-05-29T20:18:40.607 に答える
0

plyrパッケージを見てください。データを SNAME 変数で分割し、必要な集計セット (平均と合計などを混合) を実行するコードを与えると、断片が元に戻されます。おそらく、そのパッケージには「ddply」または「daply」機能が必要です。

于 2012-05-29T19:56:42.267 に答える