3

より良い言葉がないため、R data.frame に「パッチ」を適用するにはどうすればよいですか? 会社とアウトレットの列を持つマスター データベースと、この例では 1 または 0 の所有権シェア変数があるとしますが、任意のパーセンテージになる可能性があります。

// master
     firm outlet shares.pre
1    five      1          0
2     one      1          1
3     red      1          0
4  yellow      1          0
5    five      2          0
6     one      2          0
// many more

会社 "one" がアウトレット "1" を会社 "red" に販売させたいのですが、この取引は別の data.frame にあります。

// delta
  firm outlet shares.delta
1  one      1         -1
2  red      1          1

R でこの「パッチ」またはトランザクションをマスター データベースに適用する最も効率的な方法は何ですか? 最終結果は次のようになります。

// preferably master, NOT a copy
     firm outlet shares.post
1    five      1          0
2     one      1          0  <--- was 1
3     red      1          1  <--- was 0
4  yellow      1          0
5    five      2          0
6     one      2          0
// many more

接尾辞prepostまたはdelta. それらすべてに名前が付けられsharesていても問題ない場合は、これらのデータ フレームを「追加」したいだけです。

更新:私の現在のアプローチはこれです

update <- (master$firm %in% delta$firm) & (master$outlet %in% delta$outlet)
master[update,]$shares <- master[update,]$shares + delta$shares

はい、ベクトル スキャンを実行してブールupdateベクトルを作成すること、およびサブセット化もあまり効率的ではないことは承知しています。しかし、私が最も気に入らないのは、一致する列を書き出さなければならないことです。

4

2 に答える 2

2

を使用する別の方法data.tabledf1df2 data.frames の両方にデータをロードしたと仮定すると、

require(data.table)
dt1 <- data.table(df1)
dt2 <- data.table(df2)
setkey(dt1, firm, outlet)
setkey(dt2, firm, outlet)
dt1 <- dt2[dt1]
dt1[is.na(dt1)] <- 0
dt1[, shares.post := shares.delta + shares.pre]

#      firm outlet shares.delta shares.pre shares.post
# 1:   five      1            0          0           0
# 2:   five      2            0          0           0
# 3:    one      1           -1          1           0
# 4:    one      2            0          0           0
# 5:    red      1            1          0           1
# 6: yellow      1            0          0           0
于 2013-01-30T16:52:57.030 に答える
1

再現可能な例を提供していれば、より正確な答えが得られますが、1つの方法を次に示します。

  • 最初の data.framedatと 2 番目を呼び出しますchg

次に、2つをマージできます。

dat <- merge(dat,chg)

そして、単に減算します:

dat$shares <- with(dat, shares.pre + shares.delta )
于 2013-01-30T16:42:24.807 に答える