【发布时间】:2021-03-27 15:52:06
【问题描述】:
我试图弄清楚如何在 R 编程语言中使用类似于 %LIKE% 的语句。使用以下 stackoverflow 帖子:How to join (merge) data frames (inner, outer, left, right),我能够弄清楚如何在 SQL 中运行基本合并。但由于某种原因,这不适用于 %LIKE% 条件。
例如,如果我创建以下数据:
table_a <- data.frame (
"name" = c("John", "ALex", "ToM", "Kev", "Peter"),
"color" = c("red", "blue", "green", "yellow", "pink")
)
name$table_a = as.factor(name$table_a)
table_b <- data.frame (
"name" = c("Johnathan", "Alexander", "Tomas", "Kevin", "Luke", "Ryan"),
"food" = c("pizza", tacos", "sushi", "cake", "brownies", "burgers")
)
name$table_b = as.factor(name$table_b)
table_c <- data.frame (
"name" = c("Johnatha", "Alexande1", "Toma1", "Kevi1", "Luk1"),
"food" = c("pizza", tacos", "sushi", "cake", "brownies")
)
name$table_c = as.factor(name$table_c)
现在我想做的是,如果 table_a 中的名称包含在 table_b 中的某个名称中,则运行“左连接”。 (使用相同的逻辑,应该也可以使用单面的 %LIKE 吗?)
#Left joins
join_1 = merge(x = table_a, y = table_b, by = "%name%", all.x = TRUE)
join_2 = merge(x = table_b, y = table_c, by = "%name", all.x = TRUE)
在常规 SQL 语句中,如果数据行满足 %LIKE% 指定的条件,通常可以直接选择数据行。在 R 中是否有同样的可能?
# select using %LIKE% (is there a way to override "case sensitivity" ? e.g. %like% "jOn"?)
selected_1 = table_a[name %like% "Jon"|| "Ale" || "Pet"]
selected_2 = table_a[name %like% "Jon"|| "Ale" || "Pet" || color %like% "ye"]
谢谢
【问题讨论】:
-
您这里似乎有两个问题,一个是关于合并数据,一个是关于选择数据。对于后者,“data.table”具有
%like%,但要区分大小写,您必须使用like()版本。比如你可以library(data.table); as.data.table(table_b)[like(name, "joh|al|tom", ignore.case = TRUE) & like(food, "pizza")]。 -
有没有办法做到完全匹配?例如新 = (table_b) [ (name = "john|tom|alex") $ (food = "pizza)]
-
您能花一些时间确保您提供给我们的代码确实有效吗?示例:
name$table_a应该是table_a$name;tacos"应该是"tacos"。 (我相信。)它可能会分散解析问题中的拼写错误的注意力,并想知道您的问题是由于您的真实(不可见)代码中的其他拼写错误造成的,以及与其他内容相关的程度。
标签: sql r select merge data-manipulation