- 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/
我希望这段代码返回一个包含 26 个 TRUE 的向量,但它返回的都是 FALSE。 grepl(".*", LETTERS, fixed=T) 从文档中,“grepl 返回一个逻辑向量(匹配或不匹配
我想在我的数据框中创建一个新列,该列是 TRUE 还是 FALSE,具体取决于术语是否出现在两个指定的列中。 这是一些示例数据: AB M AB
我有一个格式如下所示的数据框: String Keyword 1 Apples bananas mangoes
我想在两个向量上应用 grepl 以查看第一个向量的元素是否在第二个向量的相应元素中可用。例如 grepl(c("bc","23","a2"),c("abcd","1234","zzzz")) 由于
我正在做一些看似非常简单的事情。我想使用 grepl() 命令——或类似的命令——在几个不同的短语上对 R 中的数据帧进行子集化,而不构建循环。 例如,我想提取名为 Bob 或 Mary 的任何人的所
我在将 grepl 与正则表达式结合使用时遇到困难。 这是一个小例子: 我有一个字符向量: text D_.+ | \\>F_.+", text) grepl("\\D_.+ | \\F_.+", t
看来,虽然grep具有反转参数,但 grepl 没有。 我想为使用2个过滤器的子集 data$ID[grepl("xyx", data$ID) & data$age>60] 如何为年龄大于60且ID为
我希望根据条件连接两个数据帧,在本例中,一个字符串在另一个字符串中。假设我有两个数据框, df1 % # Format resulting dataset as you requested.
我希望根据条件连接两个数据帧,在本例中,一个字符串在另一个字符串中。假设我有两个数据框, df1 % # Format resulting dataset as you requested.
我在 R 中使用 grepl() 将模式与字符串进行匹配。 我需要将多个字符串与一个公共(public)字符串匹配,如果它们全部匹配,则返回 TRUE。 例如: a <- 'DEARBORN TRUC
我需要使用另一个数据框按列过滤数据框,但由于匹配不准确,我想使用 grepl 是一种方法。 下面的代码可以作为例子: A % filter(.,grepl("RT",X)) # the result
我有一个数据框 (df),其中包含州和城市的 2 列数据。但是,有时 2 列中的数据会被调换或输入错误。数据框看起来像这样: location state Bangkok
目前我正在使用带有 grepl 的嵌套 ifelse 函数来检查与数据框中的字符串向量是否匹配,例如: # vector of possible words to match x my_text$n
我使用 grepl 检查字符串是否包含一组模式中的任何模式(我使用“|”来分隔模式)。反向搜索没有帮助。如何识别匹配的模式集? 附加信息:这可以通过编写一个循环来解决,但它非常耗时,因为我的集合有 >
我有一个包含列名和行名的数据,其中包含一个从 1 到 100 的数字的字符串。 我正在使用 grepl 来选择具有特定数字的名称(同时忽略字符串)。说我有: a <- matrix(c(1:16),
我有一个数据(大数据 125000 行,~20 MB),其中一些具有特定字符串的行需要删除,并且在读取过程中需要选择一些列。 首先,我发现grepl功能无法正常工作,因为 fread将数据作为此 qu
这个问题在这里已经有了答案: R regex to find two words same string, order and distance may vary (2 个回答) 去年关闭。 grep
我的数据框如下所示。我需要根据“geneID”列的名称一一提取特定行的数据。我使用 grepl 函数。 #Data frame:geneDf geneID=c("EGFR","Her2","PTEN
我有一个数据集(名为桌面),其中包含来自网络跟踪器的按时间顺序排列的信息,其中包含一列中不同用户访问的 URL 和另一列中的用户 ID。以搜索引擎分析为目标,我试图过滤所有包含用户向谷歌提交搜索查询的
让我们考虑一个包含两列word 和stem 的df。我想创建一个新列来检查 stem 中的值是否包含在 word 中,以及它前面或后面是否有更多字符。最终结果应该是这样的: WORD STEM
我是一名优秀的程序员,十分优秀!