4

r のデータフレーム間の Two by two matching のように -7 になる前に、次のページを既に読んでいるとしましょう。

実際、最後のものは私が望むものと本当に似ていますが、私の列が異なるため、同じではありません

私は2つのデータフレームを持っています。

> d <- data.frame(year=c(2004,2004,2006),month = c(1,5,3), height = c(1000,2000,3000) )
> d
  year month height
1 2004     1   1000
2 2004     5   2000
3 2006     3   3000

> e <- data.frame(year=c(2004),month=c(5), height = c(9999))
> e
  year month height
1 2004     5   9999

明らかに、実際のデータはこれよりも長くなります。

e の値を d にマージしたい

生のマージを試してください:

> merge(d,e)
[1] year   month  height
<0 rows> (or 0-length row.names)

Ok。したがって、「by」を追加します。

> merge(d,e,by=c("year","month"))
  year month height.x height.y
1 2004     5     2000     9999

OK、内部結合を実行し、d の元のデータをすべて削除しました。したがって、左外部結合を試してください。

> merge(d,e,by=c("year","month"),all.x = T)
  year month height.x height.y
1 2004     1     1000       NA
2 2004     5     2000     9999
3 2006     3     3000       NA

それは結合を行い、外部結合の定義に従って正しいですが、e の値から d の値を更新するという、私が望むことはしませんでした。私が本当に欲しいのは、SQLの更新のようなものです:

for (year,month,height) in e:
    update d set d.height=e.height where d.year = e.year and d.month = e.month

つまり、私が望む結果は次のようになります。

> magic(d,e)
  year month height
1 2004     1   1000
2 2004     5   9999
3 2006     3   3000

もちろん、たくさんのforループを書くこともできますが、これを行うためのベクトル化された方法があることを願っていますか?

編集: 私の例にはキー列が 1 つしかありませんでしたが、実際の問題には 2 つありました。これを反映するように例を更新しました。

4

2 に答える 2

7

使用できますdata.table

e と d の両方に月と年で定義されたキーがあることに注意して編集します

library(data.table)
DD <- as.data.table(d)
DE <- as.data.table(e)

setkey(DD,  year, month)
setkey(DE,  year, month)

DD[DE, height := i.height]

コンポーネントi.から高さの値を読み取っていることを確認するために、高さのプレフィックスを付けたことに注意してください。i

data.table vignette の概要を読めば、rownames と data.table キーの関係がすぐに理解できます。

于 2012-10-22T08:00:37.293 に答える
2

実際には、次のアプローチはより簡単です。

rownames( d ) <- d$id
d[ e$id, ]$height <- e$height

更新:キーは実際には「年-月」であるため、おそらくデータテーブルを使用するのが最善ですが、それを使用したくない場合は、次のことができます。

rownames( d ) <- paste( d$year, d$month )
d[ paste( e$year, e$month ), ]$height <- e$height
于 2012-10-22T07:58:32.300 に答える