【发布时间】:2021-07-30 12:22:05
【问题描述】:
我想跨多列运行逻辑操作(多个条件)。我写了一个运行良好的查询。但是,我想缩短我的代码,因为我必须编写几个查询。
我尝试使用“any”和“brackets”来缩短查询。但是,第二个查询运行良好,但给了我不同的答案。 “任何”功能是否适用于多列?
这是我的条件-
- 任何一列(B2 到 B5)都有 1 & B1
- 任何一列(B2 到 B5)都有 -99 和 B1
- B1 ==3,然后是“Noissue”
- 休息就是问题
| Participate | B1 | B2 | B3 | B4 | B5 | Query1 | Query2 |
|---|---|---|---|---|---|---|---|
| 3 | -1 | -1 | -1 | -1 | -1 | Noissue | Noissue |
| 1 | -1 | 1 | -1 | -1 | 1 | Noissue | Noissue |
| 1 | -1 | -1 | -1 | -1 | -1 | Issue | Noissue |
| 2 | -1 | 1 | 1 | -1 | 1 | Noissue | Noissue |
| 2 | 1 | 1 | 1 | 1 | -1 | Noissue | Noissue |
| 1 | -99 | -99 | -99 | -99 | -99 | Noissue | Noissue |
如果有人帮助我减少使用不同功能的代码行,我将不胜感激。
mutate(Batch_v1,
case_when (
((Batch_v1$B1 == 1 | Batch_v1$B2 == 1 | Batch_v1$B3 == 1 | Batch_v1$B4 == 1 | Batch_v1$B5 == 1| Batch_v1$B6 == 1| Batch_v1$B7 == 1|Batch_v1$B8 == 1|Batch_v1$B9 == 1|Batch_v1$B10 == 1|Batch_v1$BOth == 1) &
Batch_v1$Participate %in% c(1,2,-99))~"Noissue",
((Batch_v1$B1 == -99 | Batch_v1$B2 == -99 | Batch_v1$B3 == -99|Batch_v1$B4 == -99 |Batch_v1$B5 == -99|Batch_v1$B6 == -99|Batch_v1$B7 == -99|Batch_v1$B8 == 1|Batch_v1$B9 == -99|Batch_v1$B10 == -99|Batch_v1$BOth == -99) &
Batch_v1$Participate %in% c(1,2,-99))~"Noissue",
Batch_v1$Participate ==3 ~ "Noissue",
TRUE ~ "Issue"))
mutate(Batch_v1,
case_when (
((any(Batch_v1[,2:6] == 1)) & Batch_v1$Participate %in% c(1,2,-99))~ "Noissue",
((any(Batch_v1[,2:6] == -99)) & Batch_v1$Participate %in% c(1,2,-99))~ "Noissue",
Batch_v1$Participate ==3 ~ "Noissue",
TRUE ~ "Issue"))
【问题讨论】:
-
您的示例中的
query1和query2是什么?为什么第三行和第一行都有不同的query1值,尽管它们都是由-1制作的? -
any(Batch_v1[,2:6]可能不会像您认为的那样做。它将对列中的所有值进行操作,而不是您可能想要的逐行操作。 -
在描述中你说如果 B1==3 而不是“Noissue”,但在你的解决方案中它是 if Participate==3。请澄清