簡體   English   中英

在 R 中查找列之間和行內的匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM