からすべての行を保持し、からX
一致する行のみを保持する必要があるため、left_joinを使用して2つのデータフレームを結合していY
ます。ただし、完全に一致する列は1つではありません。代わりに、1つの列が存在するX
部分に2列と一致するY
、と第二列X
の一部に第3列と一致するがY
。3つすべてを一致させることによってのみ、データを適切にマージできます。これらはすべて、行のさまざまな組み合わせで一致するためです(一部重複しています)。
これまでの私の戦略はleft_join
、それぞれが異なる一致を持つ3つの別々のコマンドを実行することでした。これを行うと、行の約95%を一致させることができます(最初の一致は約70%しか得られません)。ただし、これY
により、マージされたデータの各列の3つのバージョンが残ります。貼り付けや他のいくつかの方法を使用してそれらを組み合わせようとしましたが、機能しないか、新しい列が連結されているため役に立ちません(たとえば、「12345NA12345」または「NANANA」を表示)。NA以外の結果はすべて同じになるため、最初のNA以外の結果のみを表示する必要があります。したがって、上記の2つの例では、「12345」と「NA」のみを返します。
したがって、複数の列でleft_joinを実行する方法を理解する必要があると思います(これは機能しませんが、次のようなものです:
left_join(X, Y, by = (c("Column1" = Column1) OR c("Column1" = "Column2") OR c( Column 2, Y = "Column 3")).
または、あまりエレガントではありませんが、最初の非NAの結果のみを保持するために、マージ/貼り付けされた列を再フォーマットする方法を理解する必要があります。
以下の例では、Xには2列と5行があり、Yには4列と7行があります(そのうち5つはXの行と一致します)。XとYを完全にマージする唯一の方法は、X $ Column1をY $ Column1またはY $ Column2と一致させるか、X $ Column2をY $ Column3と一致させることです。実際のデータでは周りの50,000の行があるX
との他の列のもたくさんX
とはY
)。以下からの望ましい出力は、Xからの5つの行(Yにも一致する)と、Y $ Column4の対応する値である必要があります。
X$Column1 = c(10, 150, 3550, 9421, 22000)
X$Column2 = c(Dog, Cat, Bird, Rat, Fox)
Y$Column1 = c(NA, 453, NA, NA, 3550, 9421, NA, 4200)
Y$Column2 = c(22, NA, 10, 150, 3550, NA, NA, 4200)
Y$Column3 = c(NA, Badger, Dog, NA, NA, NA, Fox, Mouse)
Y$Column4 = c(NA, 4500, 12345, 54, NA, 5555, 321, 65, 20)
上記から、3つの列(Xの3つの元の列とYの4番目の列)とともに5つの行(Xの各行に1つ)を返したいと思います。Yの他の3つの列は、照合にのみ役立ちます。上記の例のように、私のデータでは、3つの試合すべてに参加せずに、完全な(または完全に近い)試合を完了する方法はありません。私は何年もの間これを行う方法を探していましたが、私はRにまったく慣れていないので、愚かであるならば申し訳ありません。
現時点での私のコード:
merged_pvga <- left_join(merged_pvga, sherpa, by = c("issn1" = "issn_print"))
merged_pvga <- left_join(merged_pvga, sherpa, by = c("issn1" = "issn_electronic"))
merged_pvga <- left_join(merged_pvga, sherpa, by = (c("journal_title" = "title")))
merged_pvga$id_all <- paste(merged_pvga$id.x, merged_pvga$id.y, merged_pvga$id)
merged_pvga$subject_all <- paste(merged_pvga$subject.x, merged_pvga$subject.y, merged_pvga$subject)
他の列の場合など
これは、変数と変数の2回Y
をX
使用した左結合データの例です。X
ColumnA
ColumnB
注意:
Y
そして、X
2つの変数ColumnA
、を共有します。ColumnB
これにより、各左結合の後にColumnA
、結合キーとして使用されない列を結合する必要があります(たとえば、結合した後ColumnB
、2つのデータセットのを結合します)。X
は2番目の左結合で除外されます。library(dplyr)
X = tibble(id_x=1:5)
Y = tibble(id_y=1:8)
X$ColumnA = c(10, 150, 3550, 9421, 22000)
X$ColumnB = c('Dog', 'Cat', 'Bird', 'Rat', 'Fox')
Y$ColumnA = c(NA, 453, NA, NA, 3550, 9421, NA, 4200)
Y$Column2 = c(22, NA, 10, 150, 3550, NA, NA, 4200)
Y$ColumnB = c(NA, 'Badger', 'Dog', NA, NA, NA, 'Fox', 'Mouse')
Y$Column4 = c(NA, 4500, 12345, 54, NA, 5555, 321, 65)
replace_na_with_blank <- function(df, varnames) {
for (varname in varnames) {
df[is.na(df[[varname]]), varname] <- ""
}
return(df)
}
concat_columns <- function(df, v1, v2) {
idx_na <- df[[v1]]==""
df[[v1]][idx_na] <- paste(df[[v1]][idx_na], df[[v2]][idx_na], sep='')
df[[v2]] <- NULL
return(df)
}
concat_columns_num <- function(df, v1, v2) {
idx_na <- is.na(df[[v1]])
df[[v1]][idx_na] <- df[[v2]][idx_na]
df[[v2]] <- NULL
return(df)
}
merged_1 <- left_join(Y, X, by = c("ColumnA" = "ColumnA"), suffix=c("",".x"))
merged_1 = replace_na_with_blank(merged_1, c("ColumnB","ColumnB.x"))
merged_1 <- concat_columns(merged_1, "ColumnB", "ColumnB.x")
merged_1 # first merge indicator is "id_x.x"
merged_2 <- left_join(merged_1, X %>% filter(!(id_x %in% merged_1$id_x)),
by = c("ColumnB" = "ColumnB"), suffix=c("",".x"))
merged_2 <- concat_columns_num(merged_2, "ColumnA", "ColumnA.x")
merged_2 # second merge indicator is "id_x.x.x"
merge1
です
merge2
です
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加