- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望根据条件连接两个数据帧,在本例中,一个字符串在另一个字符串中。假设我有两个数据框,
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 CT
3 Smith 20 MA
4 Jung 28 RI
5 Smith 51 MA
6 Lee 38 NY
我想对这两个关于年龄的数据帧和 df2$lastnames
包含在 df1$fullnames
中的行进行左连接。我认为 fuzzy_join
可能会这样做,但我认为它不喜欢我的 grepl
:
joined_dfs <- fuzzy_join(df1, df2, by = c("ages", "fullnames"="lastnames"),
+ match_fun = c("=", "grepl()"),
+ mode="left")
Error in which(m) : argument to 'which' is not logical
期望的结果:一个与第一个相同但附加了“homestate”列的数据框。有什么想法吗?
最佳答案
你只需要修复match_fun
:
# ...
match_fun = list(`==`, stringr::str_detect),
# ...
您的想法是正确的,但是您对 fuzzyjoin::fuzzy_join()
中的 match_fun
参数的解释出错了.根据 documentation , match_fun
应该是一个
Vectorized function given two columns, returning TRUE or FALSE as to whether they are a match. Can be a list of functions one for each pair of columns specified in
by
(if a named list, it uses the names in x). If only one function is given it is used on all column pairs.
一个简单的更正就可以解决问题,通过 dplyr
进一步格式化.为了概念清晰,我在排版上将 by
列与用于匹配它们的 function
对齐:
library(dplyr)
# ...
# Existing code
# ...
joined_dfs <- fuzzy_join(
df1, df2,
by = c("ages", "fullnames" = "lastnames"),
# |----| |-----------------------|
match_fun = list(`==` , stringr::str_detect ),
# |--| |-----------------|
# Match by equality ^ ^ Match by detection of `lastnames` in `fullnames`
mode = "left"
) %>%
# Format resulting dataset as you requested.
select(fullnames, ages = ages.x, homestate)
鉴于您在此处复制的样本数据
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)
)
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")
)
此解决方案应为 joined_dfs
生成以下 data.frame
,按要求格式化:
fullnames ages homestate
1 Jane Doe 30 NJ
2 Mr. John Smith 51 MA
3 Nate Cox, Esq. 45 CT
4 Bill Lee III 38 NY
5 Ms. Kate Smith 20 MA
因为每个 ages
恰好是一个唯一的键,下面的连接仅 *names
fuzzy_join(
df1, df2,
by = c("fullnames" = "lastnames"),
match_fun = stringr::str_detect,
mode = "left"
)
将更好地说明匹配子字符串的行为:
fullnames ages.x lastnames ages.y homestate
1 Jane Doe 30 Doe 30 NJ
2 Mr. John Smith 51 Smith 20 MA
3 Mr. John Smith 51 Smith 51 MA
4 Nate Cox, Esq. 45 Cox 45 CT
5 Bill Lee III 38 Lee 38 NY
6 Ms. Kate Smith 20 Smith 20 MA
7 Ms. Kate Smith 20 Smith 51 MA
传递给 match_fun
的值应该是(symbol
的)一个 function
fuzzyjoin::fuzzy_join(
# ...
match_fun = grepl
# ...
)
或 list
这样的(符号
)函数
:
fuzzyjoin::fuzzy_join(
# ...
match_fun = list(`=`, grepl)
# ...
)
而不是提供符号
的列表
match_fun = list(=, grepl)
match_fun = c("=", "grepl()")
用户应该命名函数
`=`
grepl
然而你错误地试图调用他们:
=
grepl()
命名它们会将函数
自身传递给match_fun
,如预期的那样,而调用它们会传递它们的返回值*。在 R 中,像 =
这样的运算符使用反引号命名:`=`
。
* 假设调用没有因错误而失败。在这里,他们会失败。
要比较两个值是否相等,这里是character
向量df1$fullnames
和df2$lastnames
,您应该使用关系运算符 ==
;但是您错误地提供了赋值 运算符 =
.
此外 grepl()
没有完全按照 match_fun
期望的方式进行矢量化。而它的第二个argument (x
) 确实是一个向量
a character vector where matches are sought, or an object which can be coerced by as.character to a character vector. Long vectors are supported.
它的第一个argument (pattern
) 是(被视为)单个 character
字符串:
character string containing a regular expression (or character string for
fixed = TRUE
) to be matched in the given character vector. Coerced byas.character
to a character string if possible. If a character vector of length 2 or more is supplied, the first element is used with a warning. Missing values are allowed except forregexpr
,gregexpr
andregexec
.
因此,grepl()
不是
Vectorized function given two columns...
而是给定一个字符串(标量)和一列(向量)字符串的函数
。
你祈祷的答案不是 grepl()
而是类似 stringr::str_detect()
的东西,也就是
Vectorised over
string
andpattern
. Equivalent togrepl(pattern, x)
.
并且包装stringi::stri_detect()
.
因为您只是想检测 df1$fullnames
中的 literal 字符串是否包含 df2$ 中的 literal 字符串lastnames
,您不想意外地将 df2$lastnames
中的字符串视为 regular expression 模式。现在,您的 df2$lastnames
列在统计上不太可能包含具有特殊正则表达式字符的名称; -
是唯一的异常(exception),它在 []
之外按字面解释, 极不可能在名称中找到。 p>
如果您仍然担心意外的正则表达式,您可能需要考虑 alternative search methods与 stringi::stri_detect_fixed()
或 stringi::stri_detect_coll()
.这些分别通过 byte 执行文字匹配或 "canonical equivalence" ;后者根据语言环境和特殊字符进行调整,以与自然语言处理保持一致。
关于r - 在条件下加入两个数据帧(grepl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69574373/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!