[英]Finding matches between columns and within rows in R
我正在處理兩列 zip 代碼數據。 一列代表搜索位置,第二列代表結構位置。 我試圖查找搜索 zip 代碼和結構 zip 代碼之間何時匹配。 雖然搜索 zip 代碼將始終只有一個 zip 代碼,但該結構可能有許多不同的 zip 代碼與其相關聯,並且此數字隨每次搜索而變化。
我試過 filter(df, zip1 == zip2),但這僅在存在完全匹配且 zip2 列中只有 1 個位置 zip 時才匹配。 同樣,我嘗試過 %in% 但這並不限制行內的匹配。 我還嘗試將 Zip2 分解為與位置關聯的每個 zip 代碼的 1 個不同的列,但我在這里也失敗了,因為位置的數量可以在 1-300 之間變化。 我仍然是一個 R 初學者,非常感謝任何幫助。
感謝您的快速回復。 為了改進我的問題這里有一些示例數據可以說明我的問題(只是對@r2evans 響應的輕微修改)。
df1 <- data.frame(
searchzip = c(11111, 22222, 33333, 44444),
structurezip = c(111112222233333, 222234444, 3333533333, 44446))
在這種情況下,我會在第一行和第三行進行匹配,但不會在其他行匹配。
我認為最好的方法是首先形成一個框架,將 zip 與一個或多個匹配的 zip 配對,然后將其merge
。
樣本數據:
df1 <- data.frame(
searchzip = c(11111, 22222, 33333, 44444),
structurezip = c(11111, 22223, 33335, 44446))
zipmatch <- data.frame(
zip1 = c(11111, 11111, 22222, 22222, 33333, 33333, 33333, 44444, 44444),
zip2 = c(11111, 11112, 22222, 22223, 33333, 33334, 33335, 44444, 44445),
ismatch = TRUE)
合並及其結果:
df1new <- merge(
df1, zipmatch,
by.x = c("searchzip", "structurezip"),
by.y = c("zip1", "zip2"), all.x = TRUE)
df1new
# searchzip structurezip ismatch
# 1 11111 11111 TRUE
# 2 22222 22223 TRUE
# 3 33333 33335 TRUE
# 4 44444 44446 NA
(當您對這是在做您想做的事情感到滿意時,您可以直接覆蓋df1
而不是使用新變量df1new
。)在這種情況下,合並操作將為您提供已知匹配的TRUE
並填充不匹配的帶有NA
的行,所以我們可以簡單地將其替換為
df1new$ismatch <- !is.na(df1new$ismatch)
df1new
# searchzip structurezip ismatch
# 1 11111 11111 TRUE
# 2 22222 22223 TRUE
# 3 33333 33335 TRUE
# 4 44444 44446 FALSE
在dplyr
-說:
library(dplyr)
df1 %>%
left_join(zipmatch, by = c("searchzip" = "zip1", "structurezip" = "zip2")) %>%
mutate(ismatch = !is.na(ismatch))
# searchzip structurezip ismatch
# 1 11111 11111 TRUE
# 2 22222 22223 TRUE
# 3 33333 33335 TRUE
# 4 44444 44446 FALSE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.