3

私は2つのテーブルを持っています.1つは他よりも多くの行を持っています. 両方のテーブルが共有する行を除外したいと思います。ここで提案された解決策を試しました。

ただし、問題は、データセットが大きく、計算にかなりの時間がかかることです。簡単な解決策はありますか?以下を使用して、両方のテーブルの共有行を抽出する方法を知っています。

rownames(x1)->k
rownames(x)->l
which(rownames(x1)%in%l)->o

ここで x1 と x は私のデータ フレームです。しかし、これは共有行のみを提供します。各テーブルの一意の行を取得して、それぞれを除外するにはどうすればよいですか? 両方のテーブルを一緒にバインドできるようにするには?

4

2 に答える 2

2

(私は答え全体を編集します) 両方のdfをmerge()(Andrieのコメントから)とマージすることができます。また、パラメータ?mergeとして入力できるすべてのオプションを確認してください。by0 = row.names

以下のコードは、データフレーム(行と列の数が異なる)の例を示しています。

x = data.frame(a1 = c(1,1,1,1,1), a2 = c(0,1,1,0,0), a3 = c(1,0,2,0,0), row.names = c('y1','y2','y3','y4','y5'))
x1 = data.frame(a4 = c(1,1,1,1), a5 = c(0,1,0,0), row.names = c('y1','y3','y4','y5'))

行名を識別子として使用できる場合は、それらを新しい列として配置して、列ごとにマージします。

x$id <- row.names(x)
x1$id <- row.names(x1)

# merge by column names
merge(x, x1, by = intersect(names(x), names(x1)))

# result
#   id a1 a2 a3 a4 a5
# 1 y1  1  0  1  1  0
# 2 y3  1  1  2  1  1
# 3 y4  1  0  0  1  0
# 4 y5  1  0  0  1  0

これで問題が解決することを願っています。

編集:わかりました、今私はばかげています。すべての列の名前が両方のデータフレームで異なる場合は、行名を別の列として入力する必要はありません。使用するだけです:

merge(x,x1, by=0)
于 2012-07-26T14:04:26.383 に答える
0

各データセットから繰り返されない行のみが必要な場合:

rownames(x1)->k
rownames(x)->l
which(k%in%l) -> o
x1.uniq <- x1[k[k != o],];
x.uniq <- x[l[l != o],];

そして、それらを rbind で結合できます:

x2 <- rbind(x1.uniq,x.uniq);

繰り返し行も必要な場合は、それらを追加できます。

x.repeated <- x1[o];
x2 <- rbind(x2,x.repeated);
于 2012-07-26T12:42:38.367 に答える