2

私が持っている

a <- matrix(c(1,3,4,2,2,6,3,1,6), nrow = 3, ncol=3, byrow=TRUE, dimnames = list(NULL, c("Apples", "Pears", "Oranges")))

  Pears Apples Oranges
1     1      3       4
2     2      2       6
3     3      1       6

b <- matrix(c(1,3,2,6,3,6), nrow = 3, ncol=2, byrow=TRUE, dimnames = list(NULL, c( "Pears", "Oranges")))

  Pears Oranges
1     1       4
2     2       6
3     3       6

それらをマージして、次のような結果を取得したいと思います。

 Pears Apples Oranges
1     1      3       4
2     2      2       6
3     3      1       6
4     1     Na       4
5     2     Na       6
6     3     Na       6

つまり、列名でそれらを組み合わせて、2番目のフレームに値がないままNa / sを残します。一般的な場合、行列aが大きく、行列bが小さくなります。

rbindは機能せず、mergeは奇妙なことをします。私は何を求めていますか?これは、最終的には多くの列名を使用して何度も実行されるため、使用可能な最もメモリ効率の高いものでも実行できます。

ありがとう、

-N

編集:私が最初に尋ねたときにおそらくこれに言及するべきでしたが、実際には上記のように正確な効果を達成したいのですが、いくつかのかなり大きな注意点があります:

行列を使用しています

最初のマトリックスには、常に2番目のマトリックスよりも多くのcolnameが含まれます

パッケージbigmemoryからbig.matrixを作成したいと思うかもしれません。

4

3 に答える 3

5

複数の列がaあり、bそれを追加する必要がある場合の、より一般的なアプローチを次に示します。

b.toAdd <- setdiff (names(a), names(b))
if (length(b.toAdd))
  b[, b.toAdd] <- NA

a.toAdd <- setdiff (names(b), names(a))
if (length(a.toAdd))
  a[, a.toAdd] <- NA

rbind(a, b)

アップデート:

メモリ効率の必要性についてのあなたのコメントに気づきました。その場合、使用すると不要なコピーが作成されるためdata.table、使用することをお勧めします。isnteadには、大幅に効率的な演算子があります。<-
data.table:=

library(data.table)
a <- data.table(a)
b <- data.table(b)


if (length(b.toAdd <- setdiff (names(a), names(b))))
    b[, c(b.toAdd) := NA]

if (length(a.toAdd <- setdiff (names(b), names(a))))
    a[, c(a.toAdd) := NA]

rbind(a, b, use.names=TRUE)

#    Pears Apples Oranges
# 1:     1      3       4
# 2:     2      2       6
# 3:     3      1       6
# 4:     1     NA       4
# 5:     2     NA       6
# 6:     3     NA       6

SOを検索し[r] data.table benchmarksて、改善点のアイデアを入手してください

于 2013-03-24T19:13:28.360 に答える
3

あなたが使用することができます:

rbind(a, cbind(b, Apples=NA))
  Pears Apples Oranges
1     1      3       4
2     2      2       6
3     3      1       6
4     1     NA       4
5     2     NA       6
6     3     NA       6
于 2013-03-24T19:07:48.843 に答える
1

何を求めているのかよくわかりませんが、追加された列とマージできます(jmsingerの回答と同様)。

merge(a, cbind(b, Apples=NA), all=TRUE)
##   Pears Apples Oranges
## 1     1      3       4
## 2     1     NA       4
## 3     2      2       6
## 4     2     NA       6
## 5     3      1       6
## 6     3     NA       6
于 2013-03-24T19:09:35.240 に答える