mysql - 过滤掉非零值,除非该值是其组中唯一的值(SQL 或 R)
问题描述
我有一个记录号数据集,每条记录的列中有多个值。我想生成一个表,在每个组中它返回最小的非负非 NA 值。但是,如果该负数或 NA 对应于该记录的唯一行,那么我希望它返回 NA。
data <- data.frame(record = c(1, 1, 1, 2, 3, 3, 4), value = c(-1, 2, 40, -10, 3, 4, NA))
| record | value |
------------------
| 1 | -1 |
| 1 | 2 |
| 1 | 40 |
| 2 | -10 |
| 3 | 3 |
| 3 | 4 |
| 4 | NA |
------------------
我想得到
| record | out |
------------------
| 1 | 2 |
| 2 | NA |
| 3 | 3 |
| 4 | NA |
------------------
在 RI 中尝试过:
filter(data, value >= 0 | is.na(value))
data %>% group_by(record) %>% summarize(out = min(value))
在 MySQL 我试过
select min(value) as out
from data
where (value >= 0 or value is null))
但是,这两种解决方案都会从表中删除记录 #2。
如何包含一个检测每条记录的行数并且不消除单个记录的子句?
解决方案
一个选项是replace
那些“值”小于 0 到NA
,按“记录”分组,slice
我们得到min
“值”的行,或者如果都是NA
,则获取第一行
data %>%
mutate(value = replace(value, value < 0, NA)) %>%
group_by(record) %>%
slice(if(all(is.na(value))) 1 else which.min(value))
# A tibble: 4 x 2
# Groups: record [4]
# record value
# <dbl> <dbl>
#1 1 2
#2 2 NA
#3 3 3
#4 4 NA
推荐阅读
- python - 如何将此代码转换为功能工作代码?
- sql - NOT EXISTS 查询与 REPLACE 永远运行
- apache-kafka - 无法在kafka connect中使用接收器连接器
- google-sheets - 如何根据往年数据计算 Google 表格中的概率
- php - 如何在 php 代码中设置 MAILER_DSN 参数?
- cypress - 在 each() 中使用 invoke() 访问元素的文本。柏
- git - 如何在不克隆仓库的情况下列出目录?
- java - 需要帮助找出 Java 中的一些嵌套迭代的东西
- relational-database - 将关系转换为 BCNF
- java - Java/Spring/Maven 项目中的类路径