3

2 つのデータ フレームをマージする必要があります。最初のものは次のようになります。

> df1 <- data.frame(Artist = c("Vincent van ", "Vincent van ", "Theo van Gogh", "Alexandre", "Alexandre"), Location = c("a","a","a","b","c"), time = c(1,2,1,1,1))
> df1
         Artist Location time
1  Vincent van         a    1
2  Vincent van         a    2
3 Theo van Gogh        a    1
4     Alexandre        b    1
5     Alexandre        c    1

そして2番目:

> df2 <- data.frame(Artist = c("Vincent van Gogh", "Theo van Gogh", "Alexandre Dumas", "Alexandre Dumas"), HomeNumber = c(123,234,456,789), Location = c( "a","a","b","c"))
> df2
            Artist HomeNumber Location
1 Vincent van Gogh        123        a
2    Theo van Gogh        234        a
3  Alexandre Dumas        456        b
4  Alexandre Dumas        789        c

そして、私はこのデータフレームが欲しい:

> df3 <- data.frame(Artist = c("Vincent van ", "Vincent van ", "Theo van Gogh", "Alexandre", "Alexandre"), Location = c("a","a","a","b","c"), time = c(1,2,1,1,1), HomeNumber = c(123,123,234,456,789))
> df3
         Artist Location time HomeNumber
1  Vincent van         a    1        123
2  Vincent van         a    2        123
3 Theo van Gogh        a    1        234
4     Alexandre        b    1        456
5     Alexandre        c    1        789
> 

マージは Theo に対してのみ機能します。

    > df3 <- merge(df1, df2, by.x = "Artist", by.y = "Artist", all.x =TRUE)
> df3
         Artist Location.x time HomeNumber Location.y
1     Alexandre          b    1         NA       <NA>
2     Alexandre          c    1         NA       <NA>
3 Theo van Gogh          a    1        234          a
4  Vincent van           a    1         NA       <NA>
5  Vincent van           a    2         NA       <NA> 

その理由は 2 つあります。(a) Vincent の姓の一部が欠落してdf1いる。(b) アレクサンドルは、アレクサンドル デュマ シニアとアレクサンドル デュマ ジュニアの名前です。

で (a) に取り組むことができdf1$Artist <- gsub("Vincent van $","Vincent van Gogh", df1$Artist)ますが、私のデータは実際には非常に大きく、実行する前gsubにまず Vincent のフルネームを知る必要があります。考えられる解決策の 1 つはgrep("Vincent van "...、df2 で使用することです。結果のベクトル1gsubdf2$Artistdf1が 私はそれを行う方法がわかりません。

(b) は私には少しトリッキーです。私が考えることができる解決策の 1 つ (ただしコーディングはできません) は、if最初に関数を使用して 1 つの場所から Alexandre を選択し、次に (a) の解決策をgsub名前に使用することです。

(a) と (b) を解くと、目的の が返されると思いますdf3。これらのデータフレームを効率的にマージする方法を知っていますか? ありがとう!

編集:Alexandre実際には2つの異なるユニットであることに注意してください。したがって、2 つをマージする場合、関連する HomeNumber と Location が必要です。Vincentは 1 つの単位ですが、時間内に 2 つの観測があります。

4

1 に答える 1

2

同じIDを持つと見なしたい各データフレームに2つの行、つまり行が必要であるという事実によって、その結果が妨害されることを願っていAlexandreます。JOIN プロセスは、2 x 2 の一致を作成します。

df2$short <- substr(df2$Artist, 1,7)
df1$short <- substr(df1$Artist, 1,7)
(dfmer <- merge(df1, df2, by="short") )
#-----
    short      Artist.x Location.x time         Artist.y HomeNumber Location.y
1 Alexand     Alexandre          b    1  Alexandre Dumas        456          b
2 Alexand     Alexandre          b    1  Alexandre Dumas        789          c
3 Alexand     Alexandre          c    1  Alexandre Dumas        456          b
4 Alexand     Alexandre          c    1  Alexandre Dumas        789          c
5 Theo va Theo van Gogh          a    1    Theo van Gogh        234          a
6 Vincent  Vincent van           a    1 Vincent van Gogh        123          a
7 Vincent  Vincent van           a    2 Vincent van Gogh        123          a

最初のインスタンスを選択する場合は、場所と時間に !duplicated を使用できます。

> dfmer[!duplicated( dfmer[, c("Location.x", "time")]), ]
    short      Artist.x Location.x time         Artist.y HomeNumber Location.y
1 Alexand     Alexandre          b    1  Alexandre Dumas        456          b
3 Alexand     Alexandre          c    1  Alexandre Dumas        456          b
5 Theo va Theo van Gogh          a    1    Theo van Gogh        234          a
7 Vincent  Vincent van           a    2 Vincent van Gogh        123          a

懸念に応えて (以前は、場所をリンク変数として追加する必要があるということはありませんでした:

> (dfmer <- merge(df1, df2, by=c("short", "Location") ) )
    short Location      Artist.x time         Artist.y HomeNumber
1 Alexand        b     Alexandre    1  Alexandre Dumas        456
2 Alexand        c     Alexandre    1  Alexandre Dumas        789
3 Theo va        a Theo van Gogh    1    Theo van Gogh        234
4 Vincent        a  Vincent van     1 Vincent van Gogh        123
5 Vincent        a  Vincent van     2 Vincent van Gogh        123
于 2013-04-23T17:39:42.610 に答える