2017-01-20 4 views
0

これには非常に簡単な答えがあると確信しています。私は、ユニークなIDに基づいて被写体にレーティングを組み合わせようとしています。 IDが対象に固有であり、かつStaticScoreは異なる評価者によって行われたのはここ、私が作成した(Aggregate_Testと呼ばれる)の試験データセットは、次のとおりです。ユニークなID - 出力データ構造に基づいて行を結合するRの集合コマンド?

ID StaticScore 
1 6 
2 7 
1 5 
2 6 
3 7 
4 8 
3 4 
4 5 

慎重に他の記事を読んだ後、私は次のように作成するために集計を使用しました私はStaticScoreを差し引いて新しい変数を作成しようと

> str(StaticAggregate) 
    'data.frame': 4 obs. of 2 variables: 
    $ ID   : num 1 2 3 4 
    $ StaticScore: num [1:4, 1:2] 6 7 7 8 5 6 4 5 

:新しい列を持つデータセット:

StaticAggregate<-aggregate(StaticScore ~ ID, Aggregate_Test, c) 
    > StaticAggregate 

ID StaticScore.1 StaticScore.2 
1 1    6    5 
2 2    7    6 
3 3    7    4 
4 4    8    5 

このデータフレームは、以下のSTRを持っています。 StaticScore.2から1、私は次のエラーを取得する:

だから、

Staticdiff<-StaticScore.1-StaticScore.2 Error: object 'StaticScore.1' not found

、私を助けてください - 集約によって作成されたこのデータ構造は何ですか?行列? StaticScore.1とStaticScore.2を別々の変数に変換するにはどうすればよいでしょうか?それとも、変数を差し引いて新しい変数を作成するのですか?

答えて

0

我々はaggregate動作に関する具体的な質問については「StaticDiff」

library(data.table) 
dcast(setDT(Aggregate_Test), ID~paste0("StaticScore", rowid(ID)), value.var="StaticScore" 
      )[, StaticDiff := StaticScore1 - StaticScore2] 

を作成するために、これらの列をlongからwideフォーマットを作成し、減算するdcastを行うことができます、私たちは(連結されていますc)に 'StaticScore'を 'ID'で入力します。デフォルトの動作では、我々は、通常の列にそれを変更するにはどうすればよいstr(StaticAggregate)

str(StaticAggregate) 
#'data.frame': 4 obs. of 2 variables: 
#$ ID   : int 1 2 3 4 
#$ StaticScore: int [1:4, 1:2] 6 7 7 8 5 6 4 5 

を見てチェックすることができ

StaticAggregate<-aggregate(StaticScore ~ ID, Aggregate_Test, c) 

このaggregatematrix列を作成するのですか?今、再び

str(StaticAggregate) 
#'data.frame': 4 obs. of 3 variables: 
# $ ID   : int 1 2 3 4 
# $ StaticScore.1: int 6 7 7 8 
# $ StaticScore.2: int 5 6 4 5 

strをチェックdo.call(data.frame

StaticAggregate <- do.call(data.frame, StaticAggregate) 

で行うことができます

OPのポストのように

StaticAggregate$Staticdiff <- with(StaticAggregate, StaticScore.1-StaticScore.2) 
StaticAggregate 
# ID StaticScore.1 StaticScore.2 Staticdiff 
#1 1    6    5   1 
#2 2    7    6   1 
#3 3    7    4   3 
#4 4    8    5   3 
0

を示したように、我々はcalcuationを行うことができます質問に表示されるstrの出力は、StaticAggregate第2の列が2列の行列、StaticScoreである2列のdata.frameである。何の列がStaticAggregateまたはStaticScore.1StaticScore.2という名前StaticAggregate$StaticScoreに存在しないことを

transform(StaticAggregate, diff = StaticScore[, 1] - StaticScore[, 2]) 
## ID StaticScore.1 StaticScore.2 diff 
## 1 1    6    5 1 
## 2 2    7    6 1 
## 3 3    7    4 3 
## 4 4    8    5 3 

注:違いを使用して新しい列を作成するには

StaticAggregate$StaticScore 
##  [,1] [,2] 
## [1,] 6 5 
## [2,] 7 6 
## [3,] 7 4 
## [4,] 8 5 

:私たちはこのように行列を表示することができます。は、StaticScore行列の最初の列を示しています。

マトリックスに列名がないのは、aggregateファンクションcがそれらを生成しないためです。私たちはこれにオリジナルaggregateを変更する場合、それらは名前があります:の重要な利点があることが

StaticAggregate2$StaticScore[, "A"] 
## [1] 6 7 7 8 

StaticAggregate2$StaticScore[, "B"] 
## [1] 5 6 4 5 

注:

StaticAggregate2 <- aggregate(StaticScore ~ ID, Aggregate_Test, setNames, c("A", "B")) 
StaticAggregate2 
## ID StaticScore.A StaticScore.B 
## 1 1    6    5 
## 2 2    7    6 
## 3 3    7    4 
## 4 4    8    5 

今、私たちは、行列の列名を使用して、これを書くことができますway Rのaggregateは、結果への簡単なアクセスを可能にします。マトリックスのk番目の列は、集計関数のk番目の結果です。これは、集計関数のk番目の結果を表すdata.frameのk + 1番目の列を持つのとは対照的です。これはここで簡略化されているようには思えませんが、より複雑な問題の場合は、統計マトリックスにアクセスする必要がある場合は大幅に簡素化できます。もちろん、あなたが

do.call(data.frame, StaticAggregate) 

をしたい場合は、必ず3列にそれを平らにすることができますが、あなたはしばらくの間、それについて考える一度、あなたはそれが提供する構造が実際より便利であることがあります。

+0

迅速な対応とお手伝いをいただいた皆様、ありがとうございます。問題を解決するためのさまざまなアプローチを理解することは役に立ちます。 "do.call"関数は、私が必要とすることを行うように見え、行列の列を変数に変換します。私はそれについて多くの文書を見つけることができません - 見た目のどこに提案? – Jerry

+0

do.callはそれを平坦化しますが、実際には望ましくありません。 –

関連する問題