3

私はRとプログラミング自体にかなり慣れていませんが、現在、data.frameに問題があり、作業を続けることができません。

次のような一連のデータがあります

表1

    Individual             Score
    Tim                      45
    Tim                      77
    Tim                      32
    Clare                    92
    Clare                    70
    Clare                    88

上記の表 1 について説明します。私には複数の個人 (上の例では TIm と Clare) がいて、彼らが 3 つの異なる機会 (2009、2010、2011) で提示したテストのスコアを持っています。上記を次のように変換します。

表2

    Individual             Score09             Score10             Score11
    Tim                      45                   77                  32
    Clare                    92                   70                  88

もともとテストのサブセットの情報を持っていたので、ddply を使用して表 1 を取得しました (変数スコアはすべてのサブセットの合計にすぎません)。

実際に表 1 の代わりに表 2 を使用する方法があれば教えてください。10000 件以上の観測があり、表 1 の設定では意図した提案を進められないためです。

編集:

表 1 が生成された元の df は次のとおりです。

データフレームは次のとおりです

    Base          Individual     score_math    score_bio     score_chem
    SB1120091       Tim              12            23             10
    SB1120092       Tim              30            25             22
    SB1120101       Tim              17             5             10
    SB1120091       Clare            50            20             22
    SB1120092       Clare            40            10             20
    SB1120101       Clare            47            20             21

コードは次のとおりです。

>Table1 <-ddply(x, .(Indivual), summarise, Score=(score_math*score_bio*score_chem))

EDIT2:

元のデータ セットには Year 変数はありませんが、テストがいつ行われたかに関する情報を提供するベース変数があります。

また、スコア変数は、すべてのサブセット スコアの積として計算されます。

4

4 に答える 4

4

データ:

df <- structure(list(Individual = structure(c(2L, 2L, 2L, 1L, 1L, 1L), 
                     .Label = c("Clare", "Tim"), class = "factor"), 
                     Score = c(45, 77, 32, 92, 70, 88), 
                     count = c(1L, 2L, 3L, 1L, 2L, 3L)), 
                     .Names = c("Individual", "Score", "count"), 
                     row.names = c(NA, -6L), class = "data.frame")
df$count <- rep(c("09", "10", "11"), 2)
  • reshape基本統計からの使用:

    > reshape(df, idvar="Individual", timevar="count", direction="wide", sep="")
    
    #   Individual Score09 Score10 Score11
    # 1        Tim      45      77      32
    # 4      Clare      92      70      88
    
于 2013-01-23T16:08:52.870 に答える
2

reshape2パッケージを使用できます:

# presuming your data frame is 'xx'
library(reshape2)

# Create a 'Case' Column
xx$Case <- rep(paste0("Score", c("09", "10", "11")), 2)

dcast(xx, Individual ~ Case, value.var="Score")
 Individual Score09 Score10 Score11
      Clare      92      70      88
        Tim      45      77      32
于 2013-01-23T16:08:40.920 に答える
2

元のテーブルを提供したのでxtabs()、元のデータセットで使用します。データセットの名前が「x」であると仮定します。

xtabs(score_math + score_bio + score_chem ~ Individual + Year, x)
#           Year
# Individual 2009 2010 2011
#      Clare   92   70   88
#      Tim     45   77   32
于 2013-01-23T16:40:49.530 に答える
1

あなたのddply呼び出しは、個人ごとに関数を分割しています。これにより、個人ごとに個別のデータ フレームが生成され、各データ フレームの合計が個別に計算されます。データセット内の各個人には複数の行があるため、この合計は行ごとに 1 つの合計になります。次に、データを再び結合し、デフォルトで、最初の行ごとに 1 つの行を結果として返します。ただし、個人ごとに 1 つの行が必要です。結果を単に転置すると、1 行の行列になり、目的の動作が得られます。

あなたが提供したデータを使用して:

x <- read.table(text="Year Individual score_math score_bio score_chem
2009 Tim 12 23 10
2010 Tim 30 25 22
2011 Tim 17 5 10
2009 Clare 50 20 22
2010 Clare 40 10 20
2011 Clare 47 20 21", header=TRUE)

改訂されたddply呼び出しは次のとおりです。

> ddply(x, .(Individual), summarise, Score=t((score_math+score_bio+score_chem)))
  Individual Score.1 Score.2 Score.3
1      Clare      92      70      88
2        Tim      45      77      32

ddplyただし、実際には適切なツールではありません。各行で非常に単純な計算を行ってから、形状を変更するだけです。私の好みは、合計スコアの列を追加してdcastから、reshape2パッケージから使用することです。このように設定する理由の 1 つは、後で必要になる可能性のあるすべての情報を含む完全なマスター データ セットを用意し、それを使用してすべての計算と変換を行うためです。

library(reshape2)
x$Total <- with(x, score_math + score_bio + score_chem)
dcast(x, Individual ~ Year, value.var="Total")
于 2013-01-23T16:28:18.060 に答える