3

私はRが初めてで、平均を計算する前に因子の複数のレベルをグループ化するのに苦労しています。この問題は、グループ化する必要があるさまざまなレベルの要因を持つ何百ものファイルに対してこれを行っているという事実によって複雑になります。以前の投稿から、levels() を使用して単一レベルのこのグループ化の問題に対処する方法がわかりますが、この方法ではデータが可変的すぎます。

基本的に、因子の複数のレベルの個別平均と全体平均の両方を計算したいと思います。たとえば、ステータス列に存在する次の要因のそれぞれについて、種ごとの平均を計算したいと思います: Crypt1、Crypt2、Crypt3、Native、Intro、および Crypt 種 (Crypt1、Crypt2、Crypt2 を含む) の全体的な平均。および Crypt3 は使用できますが、Native または Intro は使用できません)。ただし、種には複数のレベルの Crypt (可変、Crypt8 まで) があるか、Native と Intro があり、これらの各レベルのすべての種の平均が最終的に同じ要約シートに平均化されます。

例えば:

Species  Status  Value
A        Crypt1    5 
A        Crypt1    6
A        Crypt2    4
A        Crypt2    8
A        Crypt3    10
A        Crypt3    50
B        Native    2
B        Native    9
B        Intro     9
B        Intro     10

各要素の最初の文字を使用してクリプト要素をグループ化できると考えていましたが、文字列ではなく要素であるため、最初の文字をターゲットにするのに苦労しており、それらの間で変換する方法がわかりません. 私は最終的に、aggregate() を使用して平均を計算しています。各因子の個々の平均を取得できますが、グループ化された因子については取得できません。どんなアイデアでも大歓迎です、ありがとう!

4

2 に答える 2

2

個々の手段の場合:

# assuming your data is in data.frame = df
require(plyr)
df.1 <- ddply(df, .(Species, Status), summarise, ind.m.Value = mean(Value))

> df.1
#   Species Status ind.m.Value
# 1       A Crypt1     5.5
# 2       A Crypt2     6.0
# 3       A Crypt3    30.0
# 4       B  Intro     9.5
# 5       B Native     5.5

Status全体的な平均については、使用中のすべてのエントリの最後にある数字を削除するという考え方ですsub/gsub

df.1$Status2 <- gsub("[0-9]+$", "", df.1$Status)
df.2 <- ddply(df.1, .(Species, Status2), summarise, oall.m.Value = mean(ind.m.Value))

> df.2
#   Species Status2 oall.m.Value
# 1       A   Crypt     13.83333
# 2       B   Intro      9.50000
# 3       B  Native      5.50000

これはあなたが期待しているものですか?

于 2013-02-21T20:58:00.050 に答える
0

別の方法があります。概念的には、Arunの答えと同じですが、ベースRの関数に固執し、ある意味で、ワークスペースと元のデータをある程度整頓します。

名前付きの「temp」から始めて、個別およびグループ化された平均用に2つの新しい「T1」と「T2」data.frameを作成したいとします。data.frame

# Verify that you don't have T1 and T2 in your workspace
ls(pattern = "T[1|2]") 
# character(0)

# Use `with` to generate T1 (individual means)
#   and to generate T2 (group means)
with(temp, {
  T1 <<- aggregate(Value ~ Species + Status, temp, mean)
  temp$Status <- gsub("\\d+$", "", Status)
  T2 <<- aggregate(Value ~ Species + Status, temp, mean)
})

# Now they're there!
ls(pattern = "T[1|2]") 
# [1] "T1" "T2"

内部からグローバル環境に<<-結果を割り当てるために使用したことに注意してください。with誰もがそれを使うのが好きというわけではありませんが、この特定のケースでは問題ないと思います。「T1」と「T2」は次のようになります。

T1
#   Species Status Value
# 1       A Crypt1   5.5
# 2       A Crypt2   6.0
# 3       A Crypt3  30.0
# 4       B  Intro   9.5
# 5       B Native   5.5

T2
#   Species Status    Value
# 1       A  Crypt 13.83333
# 2       B  Intro  9.50000
# 3       B Native  5.50000

コマンドを振り返るwithと、「ステータス」列の値を変更したように見えた可能性があります。ただし、それはを使用して作成された環境内でのみでしたwith。あなたのオリジナルdata.frameはあなたが始めたときと同じです。

temp
#    Species Status Value
# 1        A Crypt1     5
# 2        A Crypt1     6
# 3        A Crypt2     4
# 4        A Crypt2     8
# 5        A Crypt3    10
# 6        A Crypt3    50
# 7        B Native     2
# 8        B Native     9
# 9        B  Intro     9
# 10       B  Intro    10
于 2013-03-05T17:10:14.123 に答える