2つのベクトルを別々の列(またはデータフレーム)として結合し、行を一致させ、一致しない場所にNAを設定するより洗練された方法

ショーン・ジャンゼン

データフレームに結合したい同じ「もの」の2つのベクトルがあります。各ベクトルは独自の列になりますが、行は同じであり、2番目のベクトルと一致しない1つのベクトルのNA値を導入します。データは2つのベクトルとして開始されるため、共通のid値など、ベクトル値以外に一致するものはありません。

シンプルでわかりやすいアプローチを使用しておもちゃのデータテストでこれを機能させることができましたが、これを行うためのより直接的でエレガントな方法があるかどうかを知りたいと思います。

私の現在のアプローチでは、2つのベクトルをマージできる一意の値を割り当てる必要がありますが、それなしでこれを実行でき、代わりにベクトル値に依存できるかどうかが気になります。私の他の試みは、マージと結合、cbind、rbind、bind_rows、bind_cols、intersect、unionなどの関数を調べて、新しいid値を採用しないようにしました。たぶん、私はそれらをうまく使っていなかったのでしょう。私は(このようなSO上でいくつかの他の有用な記事見つけ一つ)が、それらはすべて、すでに一意の識別子で始まります。

これが私のおもちゃのデータテストで、最終的な出力がどのように見えるかを示しています。最終出力にid列があるかどうかは私には関係ありません。実際のデータは文字であるため、ここでは文字を使用していることに注意してください。

# create toy data
x <- letters[1:5]
y <- letters[2:6]
# combine into dataframe, keep only unique values & assign id
xy <- data.frame(xy=unique(c(x,y))); xy
xy$id <- 1:length(xy$xy); xy
# match id back to original toy data as dataframes
x <- data.frame(x)
x$id <- match(x$x, xy$xy)
y <- data.frame(y)
y$id <- match(y$y, xy$xy)
# merge using id
xy2 <- merge(x, y, by="id", all=TRUE)
xy2
# results in
  id    x    y
1  1    a  <NA>
2  2    b    b
3  3    c    c
4  4    d    d
5  5    e    e
6  6 <NA>    f
ベン

を使用して、2つのベクトルに基づいてキーをtidyverse使用full_joinして作成してみることができます。

library(tidyverse)

full_join(data.frame(key=x, x),
          data.frame(key=y, y), by="key") %>%
  select(-key)

または、mergeベースRで使用することもできます

merge(data.frame('key'=x, x), data.frame('key'=y, y), by='key', all=T)[-1]

出力

     x    y
1    a <NA>
2    b    b
3    c    c
4    d    d
5    e    e
6 <NA>    f

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ