4

次のように、小さいデータ フレームを大きいデータ フレームに挿入して、2 つのデータ フレームを結合する簡単な方法を探しています。

x.1: x.2:
         1.1 1.2 2.3 3.4 1.2 2.3
    ab wz de u
    紀元前×ab v
    デ・イ

望ましい結果:

xf:
         1.1 1.2 2.3 3.4
    ab wvz
    紀元前×
    でゆ

列のみのマージについて非常に多くの質問がありましたが、列と行の名前に従ってマージしたいのですが、取得できません。名前のポイントは修正スキームです。私のマージ、結合などの試みは成功しなかったので、誰かがアドバイスをくれたらうれしいです。私の頭にある解決策の 1 つは、小さなフレームをループして値を探し、毎回行/列を保存してから、大きなフレームに挿入するという手動の方法です。または、データフレームを再構築します。しかし、もっと簡単な方法があるはずですか?

前もって、ロビン

すぐに試すコードは次のとおりです。

i<-c("w", "", "y")
j<-c("", "x", "")
k<-c("","","")
l<-c("z","","")
x.1 <- data.frame(i,j,k,l, row.names=c("a.b","b.c","d.e"))
colnames(x.1)<-c("1.1","1.2","2.3","3.4")
m<-c("u", "")
n<-c("", "v")
x.2 <- data.frame(m,n, row.names=c("d.e","a.b"))
colnames(x.2)<-c("1.2","2.3")
4

2 に答える 2

3

1 つのアプローチを次に示します。

library(reshape2)
mx1 <- melt(cbind(id = rownames(x.1), x.1), id.vars="id")
mx2 <- melt(cbind(id = rownames(x.2), x.2), id.vars="id")
x12 <- rbind(mx1, mx2)
out <- dcast(x12[!x12$value == "", ], id ~ variable)
out[is.na(out)] <- ""
out
#    id 1.1 1.2 2.3 3.4
# 1 a.b   w       v   z
# 2 b.c       x        
# 3 d.e   y   u       

各データセットを「長い」データセットにすることから始めて ( melt「reshape2」から使用するのが最も簡単です)、それを「幅の広い」データセットに戻します (dcast再び「reshape2」から を使用します)。

上記の手順はすべて必要なわけではありませんが、目的の出力にできるだけ近づけるためにそれらを含めたので、どの手順を保持/削除するかを決定できます。


実際、私に言われたら、「x12」の段階でやめます。「長い」データは、おそらく長期的に操作して操作するのにはるかに便利です(しゃれは意図されていません)。


アップデート

clean.factors()また、実際にはとの 2 つの機能で構成される「datamerge」パッケージを検討することもできますversion.merge。この関数は、マージの前にclean.factors空白を に変換します。プロセスで値を変更する必要があるかどうかなど、マージがどのように実行されたかについての有益な詳細を提供することがわかるように、NA私は保管しました。verbose = TRUE

out <- Reduce(function(x, y) version.merge(x, y, add.values = TRUE, verbose = TRUE), 
              lapply(list(x.1, x.2), clean.factors, verbose = FALSE))
# Rows:  3 from `x` #1
#        0 from `y` #2
# 
# Columns:
# 1.1  Origin: `x` #1
# 1.2  Origin: `x` #1
#      Imputed 1 values from `y` #2
# 2.3  Origin: `x` #1
#      Imputed 1 values from `y` #2
#      Class missmatch: numeric vs. character
#      Converted to character
# 3.4  Origin: `x` #1

out
#      1.1  1.2  2.3  3.4
# a.b    w <NA>    v    z
# b.c <NA>    x <NA> <NA>
# d.e    y    u <NA> <NA>

もちろん、NAs を再び空白に置き換えたい場合は、単にout[is.na(out)] <- "".

于 2013-10-10T16:12:43.950 に答える
1
flatx.2 <- which(!x.2 =="", arr.ind=TRUE)
flatx.2[] <- cbind( rownames(x.2)[flatx.2[,'row']], 
                    colnames(x.2)[flatx.2[,'col']])
flatx.2  
# contains row and column names in same positions as the non-blank x.2 values
#---------
    row   col  
d.e "d.e" "1.2"
a.b "a.b" "2.3"
#--------------
x.1[ cbind(  match(flatx.2[,1], rownames(x.1)),          #identify numeric row
            match(flatx.2[,2], colnames(x.1))) ] <-      #identify numeric col
                 x.2[which(!x.2 =="", arr.ind=TRUE)]    # the non-blank values
 x.1
#-------------
    1.1 1.2 2.3 3.4
a.b   w       v   z
b.c       x        
d.e   y   u        

たまたま、これは基本的なインデックス操作だけを使用した非常にクールなものだと思います (そして、必要なスキルを持っている人にとってはかなり効率的で、data.table 構造に適用できるはずです)。LHS の位置の文字値行列を使用できると思っていましたが、試行中にエラーが発生しました。ページは?"["機能するはずだと言っているように見えるので、構文エラーが発生した場合、これを単純化できる可能性があります。

于 2013-10-10T18:02:34.327 に答える