首先,如果我的格式不好,我很抱歉,这是我第一次发帖,(也是编程和 R 的新手)
我试图在字符串变量上将两个数据框合并在一起。我正在合并大学名称,这可能不完全匹配,所以我希望使用模糊或近似字符串匹配函数进行合并。当我找到 'fuzzyjoin' 包时,我很高兴。
from cranR: stringdist_join: 根据列的模糊字符串匹配连接两个表
stringdist_join(x, y, by = NULL, max_dist = 2, method = c("osa", "lv",
"dl", "hamming", "lcs", "qgram", "cosine", "jaccard", "jw","soundex"), mode = "inner", ignore_case = FALSE, distance_col = NULL, ...)
Run Code Online (Sandbox Code Playgroud)
我的代码:
stringdist_left_join(new, institutions, by = c("tm_9_undergradu" = "Institution.Name"))
Run Code Online (Sandbox Code Playgroud)
错误:
Error in dists[include] <- stringdist::stringdist(v1[include], v2[include], :
NAs are not allowed in subscripted assignments
Run Code Online (Sandbox Code Playgroud)
我知道这些列中有一些 NA,但我不确定如何删除它们,因为我也需要它们。我知道其他连接和合并功能 NA 将被忽略。有没有人知道如何解决此包的此错误或以另一种方式对字符串进行近似连接。感谢您的帮助。
我有两个包含地址的表(街道,城市,邮政编码和两个包含这些连接值的字段),我想对Zipcode进行模糊匹配,但仅适用于具有完全相同StrCity值的情况.我开始首先只选择与字典中的StrCity匹配然后进行模糊匹配的地址,但有两个问题:
1)如果与Zipcode匹配,它不考虑街道和城市2)如果匹配地址(包含所有的Zipcode,Street和City),它也返回可能的值,在同一个邮政编码上有另一条街道在距离方面足够接近.
可能我需要同时做两个不同的匹配(一个模糊和一个精确),但我不知道如何实现它,而不是在性能方面杀死我的计算机.
这是TableAd的数据样本:
StrCity ID Zipcode Street City Address
Bia?owiejskaWarszawa 5148676 01-459 Bia?owiejska Warszawa 01-459Bia?owiejskaWarszawa
Bukowi?skaWarszawa 6423687 02-730 Bukowi?ska Warszawa 02-730Bukowi?skaWarszawa
Kana?owaWarszawa 6425093 03-536 Kana?owa Warszawa 03-536Kana?owaWarszawa
Run Code Online (Sandbox Code Playgroud)
字典样本:
Zipcode Street City Address StrCity
02-882 Agaty Warszawa 02-882AgatyWarszawa AgatyWarszawa
03-663 Kana?owa Warszawa 03-663Kana?owaWarszawa Kana?owaWarszawa
03-536 Ko?owa Warszawa 03-536Ko?owaWarszawa Ko?owaWarszawa
Run Code Online (Sandbox Code Playgroud)
这是我目前的代码:
TableMatch <- merge(TableAd, TableDict, by="StrCity")
TableMatch <- TableMatch[, -grep("y", colnames(TableMatch))]
names(TableMatch)[names(TableMatch)=="Zipcode.x"] <- "Zipcode"
names(TableMatch)[names(TableMatch)=="Address.x"] <- "Address"
ResultTable <- TableMatch %>%
stringdist_left_join(TableDict, by="Address", distance_col="dist", method="lv", max_dist=5, ignore_case = TRUE) %>%
select(ID, …Run Code Online (Sandbox Code Playgroud) 我正在使用两个要基于阈值合并的不同数据集。假设两个数据帧如下所示:
library(dplyr)
library(fuzzyjoin)
library(lubridate)
df1 = data_frame(Item=1:5,
DateTime=c("2015-01-01 11:12:14", "2015-01-02 09:15:23",
"2015-01-02 15:46:11", "2015-04-19 22:11:33",
"2015-06-10 07:00:00"),
Count=c(1, 6, 11, 15, 9),
Name="Sterling",
Friend=c("Pam", "Cyril", "Cheryl", "Mallory", "Lana"))
df1$DateTime = ymd_hms(df1$DateTime)
df2 = data_frame(Item=21:25,
DateTime=c("2015-01-01 11:12:15", "2015-01-02 19:15:23",
"2015-01-02 15:46:11", "2015-05-19 22:11:33",
"2015-06-10 07:00:02"),
Count=c(3, 7, 11, 15, 8),
Name="Sterling",
Friend=c("Pam", "Kreger", "Woodhouse", "Gillete", "Lana"))
df2$DateTime = ymd_hms(df2$DateTime)
Run Code Online (Sandbox Code Playgroud)
我现在想,是能够左连接df2与df1基于的模糊匹配DateTime,并Count为各自的价值在两秒钟内,而除了所有其他值Item都相同。我以为我可以做到以下几点:
df1 %>%
difference_left_join(df2, by=c("DateTime", "Count"), max_dist=2)
Run Code Online (Sandbox Code Playgroud)
但这给了我以下输出:
# A tibble: 8 …Run Code Online (Sandbox Code Playgroud) 我一直致力于fuzzyjoin将 2 个数据帧连接在一起,但是由于连接导致的内存问题cannot allocate memory of…。所以我正在尝试使用data.table. 数据示例如下。
df1 看起来像:
ID f_date ACCNUM flmNUM start_date end_date
1 50341 2002-03-08 0001104659-02-000656 2571187 2002-09-07 2003-08-30
2 1067983 2009-11-25 0001047469-09-010426 91207220 2010-05-27 2011-05-19
3 804753 2004-05-14 0001193125-04-088404 4805453 2004-11-13 2005-11-05
4 1090727 2013-05-22 0000712515-13-000022 13865105 2013-11-21 2014-11-13
5 1467858 2010-02-26 0001193125-10-043035 10640035 2010-08-28 2011-08-20
6 858877 2019-01-31 0001166691-19-000005 19556540 2019-08-02 2020-07-24
7 2488 2016-02-24 0001193125-16-476010 161452982 2016-08-25 2017-08-17
8 1478242 2004-03-12 0001193125-04-039482 4664082 2004-09-11 2005-09-03
9 1467858 2017-02-16 …Run Code Online (Sandbox Code Playgroud) 我正在尝试左连接两个数据框(df1、df2)。数据框共有两列:区域和斜率。区域是一个因子列,斜率是数字。
df1 = data.frame(slope = c(1:6), zone = c(rep("Low", 3), rep("High", 3)))
df2 = data.frame(slope = c(2.4, 2.4,6.2), zone = c(rep("Low", 1), rep("High", 2)), other = c(rep("a", 1), rep("b", 1), rep("c", 1)))
df1
df2
Run Code Online (Sandbox Code Playgroud)
我想加入数据框,以便它们首先在区域上完全匹配,然后是斜率最接近的匹配。如果有两个等距的斜率值,只要一致地应用规则并且不会导致重复的行,连接是向上还是向下舍入都没有关系。
我更喜欢用fuzzy_join 或dplyr 而不是data.table 来做到这一点。
结果应该类似于:
df3 = data.frame(slope = c(1:6), zone = c(rep("Low", 3), rep("High", 3)), other = c(rep("a", 3), rep("b",1), rep("c",2)))
df3
Run Code Online (Sandbox Code Playgroud)
其中“other”的值首先由区域确定,然后是最近的斜率。
我试过了:
distance_left_join(df, df2, by=c("zone"= "zone", "slope"="slope"))
Run Code Online (Sandbox Code Playgroud)
以及其他类型的模糊连接,但我认为它们可能不起作用,因为列的类型不同。我怀疑有一个fuzzy_left_join 解决方案,但我不明白如何创建匹配函数。
我正在尝试在 R 中创建一个程序,用三位数机场代码替换城市名称或机场名称。我想要进行模糊匹配以提供更大的灵活性,因为我试图替换的城市/机场名称的数据来自许多不同的来源。我的问题是,通过模糊匹配左连接,我似乎无法找到一种方法来仅从右表(代码)返回与左表(名称)最接近的匹配。
例如:将城市奥古斯塔 (Augusta, GA) 与奥古斯塔 (Augusta, GA) 和奥古斯塔 (Augusta, ME) 进行匹配并复制数据。我不想限制最大距离,因为我仍然想允许灵活性,但我不能让我的数据重复。我想找到一种方法来进行部分字符串匹配,但只返回最接近的结果。
我尝试过使用 fuzzyjoin 包,但从我所见,没有办法限制只有一场比赛或只有最佳比赛。我知道在 pmatch 中有一个禁止重复的调用,但我找不到使 pmatch 作为连接工作的方法。
data <- stringdist_left_join(data, orig, ignore_case = TRUE)
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的代码,stringdist 是 R 中 fuzzyjoin 包的函数。数据集“data”包含城市名称、航班数量和其他乘客信息。“orig”数据集有一列城市/机场名称和机场代码
SAMPLE INPUT
**data table:**
City Name Passenger Name Fare Paid
Augusta, GA Jon $100
Dallas, TX Jane $200
Spokane, WA Chris $300
**orig table:**
City Name Code
Augusta, GA JCL
Dallas, TX DAL
Denver, CO DEN
Seattle, WA SEA
Spokane, WA GEG
Austin, TX AUS
Augusta, ME …Run Code Online (Sandbox Code Playgroud) 我想加入两个数据框:
a <- data.frame(x=c(1,3,5))
b <- data.frame(start=c(0,4),end=c(2,6),y=c("a","b"))
Run Code Online (Sandbox Code Playgroud)
(x>start)&(x<end)为了得到这样的结果,条件如下:
# x y
#1 1 a
#2 2 <NA>
#3 3 b
Run Code Online (Sandbox Code Playgroud)
我不想制作一个潜在的大型笛卡尔积,然后只选择与条件匹配的几行,我想要一个使用 tidyverse 的解决方案(我对使用 SQL 的解决方案不感兴趣,这将是失败的坦白) . 我想到了 'fuzzyjoin' 包,但我找不到适合我需要的例子:申请条件的函数只有两个参数。我还尝试将“开始”和“结束”放入一个参数中data.frame(z=I(purrr::map2(b$start,b$end,list)),y=b$y)
# z y
#1 0, 2 a
#2 4, 6 b
但尽管数据看起来不错,但fuzzy_left_join 不接受。
我寻找在更一般情况下工作的解决方案(LHS 上的 n 个变量,RHS 上的 m,不一定是具有任意条件的数字)。
更新
我还希望能够表达条件,例如(x=start+1)|(x=end+1)在此处提供:
# x y
#1 1 a
#2 3 a
#3 5 b
Run Code Online (Sandbox Code Playgroud) 我有一个 130 万行的出版物数据集,对于每条记录,我想从第二个包含 860 万行的数据集中检索 paper_id。这个想法是使用两个表中的多个列来查找 dataset2 中 dataset1 的匹配项,如这个功能性但简化的脚本所示:
library(fuzzyjoin); library(tidyverse)
dataset1 %>%
stringdist_left_join(dataset2 %>% select(Title, Year, Publication_id, Paper_id),
by = list(x = c("Title", "Year", "Publication_id"),
y = c("Title", "Year", "Publication_id"))
max_dist = 3, ignore_case = TRUE, distance_col = NULL)
Run Code Online (Sandbox Code Playgroud)
我这里有两个问题。首先,只有“标题”具有需要模糊匹配的变体(拼写错误、缩写、特殊字符等),但代码接受所有三个使用字段中的变体。这增加了可能与错误匹配的数量,因为类似的标题出现在不同的年份和出版物中。
我认为可以解决第一个问题的解决方案是:
library(fuzzyjoin); library(tidyverse)
dataset1 %>%
stringdist_left_join(dataset2 %>%
select(Title2 = Title, Year2 = Year, Pub_id2 = Publication_id, Paper_id),
by = list(x = c("Title", "Year", "Publication_id"),
y = c("Title2", "Year2", "Pub_id2"))
max_dist = 3, ignore_case = TRUE, distance_col = NULL) …Run Code Online (Sandbox Code Playgroud) 我正在开展一个项目,根据不同国家/地区的体育比赛结果分析国家/地区内个人层面的调查数据,但我不确定产生我想要的合并的最有效方法是什么。
我正在处理两个单独的数据集。一种包含嵌套在国家/地区内的个人级数据。数据可能如下所示:
country <- c(rep("Country A", 4), rep("Country B", 6))
date <- c("2000-01-01", "2000-01-02", "2000-01-03", "2000-01-04", rep("2000-01-01", 2), "2000-01-02", rep("2000-01-03", 3))
outcome <- rnorm(10)
individual_data <- cbind.data.frame(country, date, outcome)
rm(country, date, outcome)
Run Code Online (Sandbox Code Playgroud)
另一个有国家比赛级别的数据,看起来像这样:
date <- rep("2000-01-02", 2)
country <- c("Country A", "Country B")
opponent <- c("Country B", "Country A")
match_outcome <- c("L", "W")
match_data <- cbind.data.frame(date, country, opponent, match_outcome)
rm(date, country, opponent, match_outcome)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,只有一场比赛是在 2000 年 1 月 2 日进行的,其中 A 国输给了 B 国。我想执行一个fuzzy_join与left_join这里相反的match_data比赛, …
我有两个要合并的数据库。来自此链接:与 data.table 进行“模糊”和非模糊、多对一合并。我知道当没有直接匹配时,我可以将这些 data.tables 与最近可用的年份合并,如下所示:
library(data.table)
dfA <- fread("
A B C D E F G Z iso year matchcode
1 0 1 1 1 0 1 0 NLD 2010 NLD2010
2 1 0 0 0 1 0 1 NLD 2014 NLD2014
3 0 0 0 1 1 0 0 AUS 2010 AUS2010
4 1 0 1 0 0 1 0 AUS 2006 AUS2006
5 0 1 0 1 0 1 1 USA 2008 USA2008
6 0 0 …Run Code Online (Sandbox Code Playgroud) library(tidyverse)
library(fuzzyjoin)
df1 <- tibble(col1 = c("apple", "banana", "carrot"),
col2 = as.numeric(0:2),
col3 = as.numeric(0:2))
#> # A tibble: 3 x 3
#> col1 col2 col3
#> <chr> <int> <int>
#> 1 apple 0 0
#> 2 banana 1 1
#> 3 carrot 2 2
df2 <- tibble(col4 = c("app", "carr"), col5 = c(5, 9), matched = rep(TRUE, 2))
#> # A tibble: 2 x 3
#> col4 col5 matched
#> <chr> <dbl> <lgl>
#> 1 app 5 TRUE
#> …Run Code Online (Sandbox Code Playgroud) 我希望根据条件连接两个数据帧,在本例中,一个字符串位于另一个字符串内。假设我有两个数据框,
df1 <- data.frame(fullnames=c("Jane Doe", "Mr. John Smith", "Nate Cox, Esq.", "Bill Lee III", "Ms. Kate Smith"),
ages = c(30, 51, 45, 38, 20))
fullnames ages
1 Jane Doe 30
2 Mr. John Smith 51
3 Nate Cox, Esq. 45
4 Bill Lee III 38
5 Ms. Kate Smith 20
df2 <- data.frame(lastnames=c("Doe", "Cox", "Smith", "Jung", "Smith", "Lee"),
ages=c(30, 45, 20, 28, 51, 38),
homestate=c("NJ", "CT", "MA", "RI", "MA", "NY"))
lastnames ages homestate
1 Doe 30 NJ
2 Cox 45 …Run Code Online (Sandbox Code Playgroud) library(tidyverse)
library(fuzzyjoin)
df1 <- tibble(col1 = c("Apple Shipping", "Banana Shipping", "FedEX USA Ground",
"FedEx USA Commercial", "FedEx International"),
col2 = 1:5)
#> # A tibble: 5 x 2
#> col1 col2
#> <chr> <int>
#> 1 Apple Shipping 1
#> 2 Banana Shipping 2
#> 3 FedEX USA Ground 3
#> 4 FedEx USA Commercial 4
#> 5 FedEx International 5
df2 <- tibble(col3 = c("Banana", "FedEX USA"), col4 = c(700, 900))
#> # A tibble: 2 x 2
#> …Run Code Online (Sandbox Code Playgroud) fuzzyjoin ×13
r ×13
dplyr ×5
merge ×3
data.table ×2
join ×2
left-join ×2
fuzzy ×1
fuzzy-search ×1
grepl ×1
matching ×1
one-to-one ×1
purrr ×1
stringdist ×1
stringr ×1