4

サイズの異なる2つのデータをIDでマージしようとしています。ただし、一致する値の場合、両方のデータに重複したエントリが含まれている可能性があります。つまり、データAに3つのID#3があり、データBに3つのID#3がある可能性があります。データをマージしようとすると、結果は両方よりもはるかに大きくなります。結合されたデータ。

C<-merge(A,B,by="ID",all.x=T,sort=F)

Bの最初のID#3とAの最初のID#3がペアになるように、2つのデータをID列でマージしたいと思います。

また、データAの行順は同じままにしておきたい。sort = FALSEはあまり役に立ちませんでした。一致するすべての行が上部に配置され、一致しない行が下部に配置されます。

ご協力いただきありがとうございます!

4

2 に答える 2

5

マージする前に、各 data.frame に、値が独自の ID グループ内の各観測のインデックスを記録する列を追加する必要があります。

## Example data
A <- data.frame(ID=c(1,1,1,2), ht=1:4)
B <- data.frame(ID=c(1,1,2,2), wt=3:6)

## Add column with number of each observation within ID
A <- transform(A, ID2=ave(ID, ID, FUN=seq_along))
B <- transform(B, ID2=ave(ID, ID, FUN=seq_along))

## Now carry out the merge
merge(A, B, all.x=TRUE, sort=FALSE)
#   ID ID2 ht wt
# 1  1   1  1  3
# 2  1   2  2  4
# 3  2   1  4  5
# 4  1   3  3 NA
于 2013-02-02T01:12:13.290 に答える
2

助けてくれてありがとう、それは本当に便利です。順序を維持したい大きなデータに数値の列を追加することになります。

@Josh O'Brien の例を使用すると、

> ## Example data
> A <- data.frame(ID=c(1,1,1,2), ht=1:4)
> B <- data.frame(ID=c(1,1,2,2), wt=3:6)
> 
> ## Add column with number of each observation within ID
> A <- transform(A, ID2=ave(ID, ID, FUN=seq_along))
> B <- transform(B, ID2=ave(ID, ID, FUN=seq_along))
> 
> # Add a new column in A that numbers the row from 1 to number of row
> A$ORDER_DATA <- 1:nrow(A) 
> 
> ## Now carry out the merge
> C<-merge(A, B, all.x=TRUE, sort=FALSE)
> 
> # Sort the merged data by ORDER_DATA column
> D<-C[with(C,order(ORDER_DATA)),]
> D
  ID ID2 ht ORDER_DATA wt
1  1   1  1          1  3
2  1   2  2          2  4
4  1   3  3          3 NA
3  2   1  4          4  5
于 2013-02-05T08:50:28.237 に答える