11

data.frame互いに行を追加したいオブジェクトのリストがありますmerge(..., all=T)。ただし、mergeそのままにしておく必要がある行名を削除しているようです。何か案は?例:

x = data.frame(a=1:2, b=2:3, c=3:4, d=4:5, row.names=c("row_1", "another_row1"))
y = data.frame(a=c(10,20), b=c(20,30), c=c(30,40), row.names=c("row_2", "another_row2"))
> merge(x, y, all=T, sort=F)
     a  b  c  d
  1  1  2  3  4
  2  2  3  4  5
  3 10 20 30 NA
  4 20 30 40 NA
4

2 に答える 2

15

実際にマージしているのではなく、単に rbind を行っていることがわかっているので、このようなものがうまくいくかもしれません。rbind.fill「plyr」から利用します。使用するには、使用する のいずれかを指定listdata.frameますrbind

RBIND <- function(datalist) {
  require(plyr)
  temp <- rbind.fill(datalist)
  rownames(temp) <- unlist(lapply(datalist, row.names))
  temp
}
RBIND(list(x, y))
#               a  b  c  d
# row_1         1  2  3  4
# another_row1  2  3  4  5
# row_2        10 20 30 NA
# another_row2 20 30 40 NA
于 2013-02-10T15:56:15.610 に答える
11

1 つの方法はrow.names、マージで使用して、追加の列として取得することです。

> merge(x, y, by=c("row.names", "a","b","c"), all.x=T, all.y=T, sort=F)

#      Row.names  a  b  c  d
# 1        row_1  1  2  3  4
# 2 another_row1  2  3  4  5
# 3        row_2 10 20 30 NA
# 4 another_row2 20 30 40 NA

編集:mergeで関数を見るとgetS3method('merge', 'data.frame')row.names明らかに NULL に設定されています (かなり長いコードなので、ここには貼り付けません)。

# Commenting 
# Lines 63 and 64
row.names(x) <- NULL
row.names(y) <- NULL

# and 
# Line 141 (thanks Ananda for pointing out)
attr(res, "row.names") <- .set_row_names(nrow(res))

MERGEOPがこの例で意図しているように、新しい関数を作成すると、たとえば が機能します。ただの実験。

于 2013-02-10T15:55:31.273 に答える