1

2つのデータセットを結合しようとしています。それらをxおよびyと呼びます。yのID変数はxのID変数のサブセットであると私は信じています。しかし、xにはyよりも多くのIDが含まれていることはわかっていますが、マッピングがわからないため、純粋な意味ではありません。つまり、xとyのIDの一部(すべてではない)を1:1で一致させることができます。

私の最終的な目標は、この1:1マッピングが失敗する場所を特定し、これらの観測にフラグを立てることです。マージが進むべき道だと思いましたが、そうではないかもしれません。例を以下に示します。

id <- c(1:10, 1:100)

X1 <- rnorm(110, mean = 0, sd = 1)
year <- c("2004","2005","2006","2001","2002") 
year <- rep(year, 22)

month = c("Jul","Aug","Sep","Oct","Nov","Dec","Jan","Feb","Mar","Apr")
month <- rep(month, 11)

#dataset X
x <- cbind(id, X1, month, year)

#dataset Y
id2 <- c(1:10, 200)
Y1 <- rnorm(11, mean = 0 , sd = 1)
y <- cbind(id2,Y1)

#merge on the IDs; but we get an error because when id2 == 200 in y we don't 
#have a match in x 
result <- merge(x, y, by.x="id", by.y = "id2", all =TRUE)

id2 == 200がxデータセットに一致しなかったため、マージはエラーをスローしました。残念ながら、IDとすべての情報も失くしてしまいました。(行111では200に等しいはずです):

tail(result) 
      id                   X1 month year         Y1
106   95  -0.0748386054887876   Nov 2002         NA
107   96    0.196765325477989   Dec 2004         NA
108   97    0.527922135906927   Jan 2005         NA
109   98    0.197927230533413   Feb 2006         NA
110   99 -0.00720474886698309   Mar 2001         NA
111 <NA>                 <NA>  <NA> <NA> -0.9664941

さらに、マージされたファイルのID変数で重複した観測値を取得します。id2 == 1の観測値は1回しか存在しませんでしたが、2回コピーしただけです(たとえば、Y1は値1.55を2回取得します)。

head(result)
   id                 X1 month year       Y1
1   1  -0.67371266313441   Jul 2004 1.553220
2   1 -0.318666983469993   Jul 2004 1.553220
3  10 -0.608192898092431   Apr 2002 1.234325
4  10  -0.72299929212347   Apr 2002 1.234325
5 100 -0.842111221826554   Apr 2002       NA
6  11  -0.16316681842082   Jul 2004       NA

このマージにより、私が意図したよりも複雑になりました。xのすべての観測値を調べて、idがyのid2と一致する場所を特定し、一致しないものにフラグを立てることができることを望んでいました。したがって、新しいベクトルを取得し、それをフラグと呼びます。これは、x$idがy$id2で一致する場合は値1を取り、それ以外の場合はゼロを取ります。このようにして、1:1マッピングがどこで失敗したかを知ることができました。NAを再コーディングすることで、これをある程度牽引できる可能性がありますが、id2 ==200の場合にスローされるエラーについてはどうでしょうか。情報を破棄するだけです。

運が悪かったので行を追加しようとしましたが、マージもあきらめるべきだと思われます。おそらく、これらの行に沿って何かを行うためにループまたは関数を絞ったほうがよいでしょう。

xのすべての観測に対して

id2 = which(id2)はid-month-yearに対応します

上記の長さが==1の場合はフラグ=1、それ以外の場合は0

うまくいけば、これはすべて理にかなっています。助けや指導をいただければ幸いです。

4

2 に答える 2

0

にあるものを探しているならx$idy$id2あなたは使うことができます

x$id %in% y$id2

一致を返す論理ベクトルを取得します。ただし、1対1の対応を保証するものではありません。1対多です。次に、このベクトルをデータフレームに追加できます

x$match.y <- x$id %in% y$id2

のどの行にx対応するIDがあるかを確認しますy

どの観測値が1対1であるかを確認するには、次のようにします。

y$id2[duplicated(y$id2)] #vector of duplicate elements in y$id2
(x$id %in% y$id2) & !(x$id %in% y$id2[duplicated(y$id2)])

に複数回出現する要素を除外しますy$id2。これをに追加することもできますx

x$match.y.unique <- (x$id %in% y$id2) & !(x$id %in% y$id2[duplicated(y$id2)])

同じ手順を実行して、で一致する行と、一意に一致するy行を判別できます。yx

于 2013-01-03T16:36:53.077 に答える
0

マージが失敗した理由は、xとyに2つの異なる構造(1つは数値行列、もう1つは文字行列)を指定したためです。cbindいつdata.frame選択すべきかを使用することは、失敗の一般的な戦略です。

> str(x)
 chr [1:110, 1:4] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "1" "2" ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "id" "X1" "month" "year"
> str(y)
 num [1:11, 1:2] 1 2 3 4 5 6 7 8 9 10 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:2] "id2" "Y1"

この関数を使用したdata.frame場合(データフレームが機能するmergeことになっているため)、成功したはずです。

> x <- data.frame(id, X1, month, year); y <- data.frame(id2,Y1)
> str( result <- merge(x, y, by.x="id", by.y = "id2", all =TRUE) )
'data.frame':   111 obs. of  5 variables:
 $ id   : num  1 1 2 2 3 3 4 4 5 5 ...
 $ X1   : num  1.5063 2.5035 0.7889 -0.4907 -0.0446 ...
 $ month: Factor w/ 10 levels "Apr","Aug","Dec",..: 6 6 2 2 10 10 9 9 8 8 ...
 $ year : Factor w/ 5 levels "2001","2002",..: 3 3 4 4 5 5 1 1 2 2 ...
 $ Y1   : num  1.449 1.449 -0.134 -0.134 -0.828 ...

> tail( result <- merge(x, y, by.x="id", by.y = "id2", all =TRUE) )
     id         X1 month year        Y1
106  96 -0.3869157   Dec 2004        NA
107  97  0.6373009   Jan 2005        NA
108  98 -0.7735626   Feb 2006        NA
109  99 -1.3537915   Mar 2001        NA
110 100  0.2626190   Apr 2002        NA
111 200         NA  <NA> <NA> -1.509818

'x'引数に重複がある場合は、結果に重複が生じるはずです。!duplicatedその場合、適切と思われる方法(マージの前または後)で使用するのはあなたの責任ですが、mergeそのような決定を行うことは期待できません。

于 2013-01-03T16:58:11.690 に答える