- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
想法是使用可管理的方法从一些表中定义规则:
library(data.table)
a <- data.table(rule = c("rule1", "rule2", "rule3"),
bool = c(T,T,F))
a
# rule bool
# 1: rule1 TRUE
# 2: rule2 TRUE
# 3: rule3 FALSE
ifelse(a[rule == "rule1", bool] & a[rule == "rule2", bool] & a[rule == "rule3", bool], 1,
ifelse(a[rule == "rule1", bool] & a[rule == "rule2", bool], 2,
ifelse(a[rule == "rule2", bool] & a[rule == "rule3", bool], 3, 4)))
# [1] 2
显然,随着我不断添加规则,这不是很可持续或可读。这里有什么可以替代 ifelse
?
最佳答案
这是一个非常有趣的问题,特别是当条件并不总是涉及 a
的所有行时,即 rule1
、rule2
, 和 规则 3
。
我试图找到一个通用的解决方案,它可以针对任意数量的条件以及 a
中的额外行进行扩展。
主要思想是将嵌套的 ifelse()
或 case_when()
语句中的条件分别替换为 data.table
然后可以以某种方式与 a
连接:
library(data.table)
b <- fread(
"rule1, rule2, rule3, result
TRUE, TRUE, TRUE, 1
TRUE, TRUE, NA, 2
NA, TRUE, TRUE, 3
NA, NA, NA, 4"
)
例如,第 2 行的条件指定如果 rule1
和 rule2
都为 TRUE
则返回 2
而rule3
的值无关紧要,可以作为通配符 忽略。
请务必注意条件的顺序:首先,必须检查没有任何通配符 的条件。然后,带有一个通配符 的条件,依此类推。最后,如果没有找到其他匹配项,则应用默认值(所有通配符)。默认值必须始终在最后一行给出。
因此,最特殊的条件排在最前面,最一般的条件排在最后。
OP 已经给出了长格式的测试数据a
:
rule bool
1: rule1 TRUE
2: rule2 TRUE
3: rule3 FALSE
因此,条件 b
也被 reshape 为长格式:
lb <- melt(b[, id := .I], c("id", "result"), variable.name = "rule", value.name = "bool", na.rm = TRUE)[
, nr := .N, by = id][]
lb
id result rule bool nr
1: 1 1 rule1 TRUE 3
2: 2 2 rule1 TRUE 2
3: 1 1 rule2 TRUE 3
4: 2 2 rule2 TRUE 2
5: 3 3 rule2 TRUE 2
6: 1 1 rule3 TRUE 3
7: 3 3 rule3 TRUE 2
在 reshape 之前,添加了一行 id
来指示条件的顺序。 通配符 从长格式中省略,因为连接不需要它们。整形后,附加每个id
的剩余行数nr
,即非通配符条目的数量。
现在,测试条件:
answer <- lb[a, on = .(rule, bool), nomatch = 0L][
, result[nr == .N], by = .(nr, id)][
order(-nr, id), first(V1)]
if (length(answer) == 0L) answer <- b[id == max(id), result] # default
answer
这分为四个步骤:
a
和 lb
在 rule
和 bool
上连接(内部连接),id
的条件数来移除(nr
包含在中=
子句只是为了方便,因为下一步需要它),结果
,answer
,则返回默认值。对于给定的a
,上面的代码返回
answer
[1] 2
要验证以上代码是否正常工作,需要进行更彻底的测试
test <- CJ(rule1 = c(TRUE, FALSE), rule2 = c(TRUE, FALSE), rule3 = c(TRUE, FALSE), sorted = FALSE)
test
rule1 rule2 rule3
1: TRUE TRUE TRUE
2: TRUE TRUE FALSE
3: TRUE FALSE TRUE
4: TRUE FALSE FALSE
5: FALSE TRUE TRUE
6: FALSE TRUE FALSE
7: FALSE FALSE TRUE
8: FALSE FALSE FALSE
每一行代表一个版本的a
,由
a <- melt(test[i], measure.vars = patterns("^rule"), variable.name = "rule", value.name = "bool")
通过遍历 i
,可以测试 TRUE
/FALSE
值的所有可能组合。此外还打印了一些有助于理解工作原理的中间结果:
library(magrittr) # piping used here to improve readability
test <- CJ(rule1 = c(TRUE, FALSE), rule2 = c(TRUE, FALSE), rule3 = c(TRUE, FALSE), sorted = FALSE)
for (i in seq(nrow(test))) {
cat("test case", i, "\n")
a <- melt(test[i], measure.vars = patterns("^rule"), variable.name = "rule", value.name = "bool") %T>%
print()
lb[a, on = .(rule, bool), nomatch = 0L][, result[nr == .N], keyby = .(nr, id)] %>%
unique() %>%
print() # intermediate result printed for illustration
answer <- lb[a, on = .(rule, bool), nomatch = 0L][
, result[nr == .N], by = .(nr, id)][
order(-nr, id), first(V1)]
if (length(answer) == 0L) answer <- b[id == max(id), result] # default from b
cat("answer = ", answer, "\n\n")
}
test case 1
rule bool
1: rule1 TRUE
2: rule2 TRUE
3: rule3 TRUE
nr id V1
1: 2 2 2
2: 2 3 3
3: 3 1 1
answer = 1
test case 2
rule bool
1: rule1 TRUE
2: rule2 TRUE
3: rule3 FALSE
nr id V1
1: 2 2 2
answer = 2
test case 3
rule bool
1: rule1 TRUE
2: rule2 FALSE
3: rule3 TRUE
Empty data.table (0 rows and 3 cols): nr,id,V1
answer = 4
test case 4
rule bool
1: rule1 TRUE
2: rule2 FALSE
3: rule3 FALSE
Empty data.table (0 rows and 3 cols): nr,id,V1
answer = 4
test case 5
rule bool
1: rule1 FALSE
2: rule2 TRUE
3: rule3 TRUE
nr id V1
1: 2 3 3
answer = 3
test case 6
rule bool
1: rule1 FALSE
2: rule2 TRUE
3: rule3 FALSE
Empty data.table (0 rows and 3 cols): nr,id,V1
answer = 4
test case 7
rule bool
1: rule1 FALSE
2: rule2 FALSE
3: rule3 TRUE
Empty data.table (0 rows and 3 cols): nr,id,V1
answer = 4
test case 8
rule bool
1: rule1 FALSE
2: rule2 FALSE
3: rule3 FALSE
Empty data.table (0 rows and 3 cols): nr,id,V1
answer = 4
从回答中可以看出,给定的条件都满足了。
测试用例 1 值得仔细研究。此处,条件 id
1、2 和 3 可能适用,但条件 1 优先于其他条件,因为它是最专业的。
这是为了表明解决方案可以针对 a
中的更多规则以及 b
中的更多条件进行扩展。
这是一个包含 7 个条件和 4 个规则列的示例。
b4 <- fread(
"rule1, rule2, rule3, rule4, result
TRUE, TRUE, TRUE, TRUE, 1
TRUE, TRUE, NA, NA, 2
NA, TRUE, TRUE, NA, 3
NA, FALSE, NA, NA, 5
TRUE, FALSE, NA, NA, 6
FALSE, FALSE, NA, FALSE, 7
NA, NA, NA, NA, 4"
)
测试代码已经过简化,可以更紧凑地查看 16 个文本案例:
lb <- melt(b4[, id := .I], c("id", "result"), variable.name = "rule", value.name = "bool", na.rm = TRUE)[, nr := .N, by = id][]
test <- CJ(rule1 = c(TRUE, FALSE), rule2 = c(TRUE, FALSE), rule3 = c(TRUE, FALSE), rule4 = c(TRUE, FALSE), sorted = FALSE)
sapply(
seq(nrow(test)),
function(i) {
a <- melt(test[i], measure.vars = patterns("^rule"), variable.name = "rule", value.name = "bool")
answer <- lb[a, on = .(rule, bool), nomatch = 0L][, result[nr == .N], by = .(nr, id)][order(-nr, id), first(V1)]
if (length(answer) == 0L) answer <- b4[id == max(id), result] # default from b
return(answer)
}
) %>%
cbind(test, .) %>%
setnames(".", "result") %>%
print()
它返回测试用例表,即宽格式的 a
的不同用例,并附加结果:
rule1 rule2 rule3 rule4 result
1: TRUE TRUE TRUE TRUE 1
2: TRUE TRUE TRUE FALSE 2
3: TRUE TRUE FALSE TRUE 2
4: TRUE TRUE FALSE FALSE 2
5: TRUE FALSE TRUE TRUE 6
6: TRUE FALSE TRUE FALSE 6
7: TRUE FALSE FALSE TRUE 6
8: TRUE FALSE FALSE FALSE 6
9: FALSE TRUE TRUE TRUE 3
10: FALSE TRUE TRUE FALSE 3
11: FALSE TRUE FALSE TRUE 4
12: FALSE TRUE FALSE FALSE 4
13: FALSE FALSE TRUE TRUE 5
14: FALSE FALSE TRUE FALSE 7
15: FALSE FALSE FALSE TRUE 5
16: FALSE FALSE FALSE FALSE 7
关于避免嵌套 ifelse 语句的规则表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59499043/
我需要在 nginx-ingress 版本上允许来自多个来源的请求:http://localhost:4200、http://localhost:4242 等1.7.1.但我无法对多个来源执行此操作,
我正在部署我使用 APIGILITY 开发的 API到 IIS。由于 IIS 不支持 .htaccess,我试图从 .htaccess 文件的内容创建 web.config 文件。我使用 IISv7.
我正在尝试更改上面 css 样式中的“宽度”规则。在“inspect element”中你可以看到宽度是1008px。我不希望它是 1008px 但它不会让我在 css 样式中更改它你可以看到它被“删
外部css赋值有2种方法,我用的是第一种;大多数网站使用第二种方法。我想知道我是否做错了! 第一种方法: 为几乎每个 css 规则创建一个类并在任何地方使用它们。 blah blah .f_
RDF使用 WEB 标识符 (URIs) 来标识资源,使用属性和属性值来描述资源 RDF 资源、属性和属性值 RDF使用 WEB 标识符来标识事物,并通过属性和属性值来描述资源。 关于资源、属性
我想挖掘特定的 rhs 规则。文档中有一个示例证明这是可能的,但仅适用于特定情况(如下所示)。先来一个数据集来说明我的问题: input {b=100002} 0.2500000 0.250000
我想让 nginx 从网站根目录(:http://localhost:8080/)提供一个静态文件,但它为我的代理通行证提供服务;它提供“/”规则而不是“=/”。 这是我的 nginx 配置的样子:
根据gnu make documentation , 如果一个规则通过一次调用生成多个目标(例如,一个配方执行一个带有多个输出文件的工具),你可以使用 '&:' 规则语法来告诉 make。但是,当在多
我已阅读Firebase Documentation并且不明白什么是 .contains()。 以下是文档中 Firebase 数据库的示例规则: { "rules": { "rooms"
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我正在尝试做一些多态性练习,但我无法弄清楚这种多态性是如何工作的。我没有找到任何关于这种练习的深入信息。希望大家能给我一些解释。 练习1: class Top { public void m(
为了调试复杂的 XSLT 转换,我将其分为几个部分:首先构建 %.1.xml,然后使用它构建 %.2.xml ,最后构建 %.3.xml。一切正常,但如果我要求 Make 构建最后一个,Make 总是
我尝试了 hacerrank 的 slove 练习 Click我不知道如何添加这些规则: ► 它可以包含 4 个一组的数字,并用一个连字符“-”分隔。 ► 不得有 4 个或更多连续重复数字。 这是我的
我正在尝试编写一个小测验,我希望“再试一次”按钮遵循与“else”之前的“if”语句相同的规则 using System; public class Program { public stat
在我的 Spring/Boot Java 项目中,我有一组服务方法,例如以下一个: @Override public Decision create(String name, String descr
我正在阅读 Covariant virtual function .上面写着 假设 B::f 覆盖了虚函数 A::f。如果满足以下所有条件,A::f 和 B::f 的返回类型可能不同: 1) The
我工作的公司想要分发(在公共(public)链接中)具有内部签名的应用程序。我很确定 Apple 否认这种事情,但我在官方文档/契约(Contract)中没有找到任何相关信息。 有谁知道它到底是如何工
我是 CSS 新手。我观察到一个奇怪的 CSS 行为,其中一个元素具有以下 CSS 属性 .container .header{ color: #FFFFFF; font-size: 2em;
这个问题在这里已经有了答案: Is there a CSS selector for elements containing certain text? (21 个答案) 关闭 7 年前。
我有以下 CSS: workoutcal.css: .errorlist{ color:red; } 以下基本模板: base.html: {% load static %} {
我是一名优秀的程序员,十分优秀!