我想获取R中包含负号和正号(diff_start
)的列的最大负值,以及另一列(diff_end
)的最小正值。
数据:
data <- read.table(text ="
id lab diff_start diff_end
1 hb -1.7 -1.8
1 hb -0.3 -0.3
1 hb 0.6 0.5
1 hb 0.7 0.8", header = TRUE)
所需的输出:
# id lab diff_start diff_end
# 1 hb -0.3 0.5
我所做的:
<= 0
的{{1}}和diff_start
的{{1}} 我认为这很长且效率很低,希望使其更加简洁。
>= 0
答案 0 :(得分:3)
尝试一下:
max(data$diff_start[data$diff_start < 0])
min(data$diff_end[data$diff_end > 0])
结果:
> max(data$diff_start[data$diff_start < 0])
[1] -0.3
> min(data$diff_end[data$diff_end > 0])
[1] 0.5
编辑:
要维护分组,可以使用:
by(data, list(data$id, data$lab), function(x) {
c(max(x$diff_start[x$diff_start < 0]),
min(x$diff_end[x$diff_end > 0]))
})
输出
[1] -0.3 0.5
答案 1 :(得分:1)
您可以通过以下方式分解代码:
data %>%
group_by(id, lab) %>%
summarise(diff_start = max(diff_start[diff_start <= 0]), diff_end = min(diff_end[diff_end >= 0])) %>%
ungroup()
# A tibble: 1 x 4
id lab diff_start diff_end
<int> <fct> <dbl> <dbl>
1 1 hb -0.3 0.5
无需先进行过滤,因为您可以在summarize
中进行过滤。
要处理缺失的负片或正片:
data %>%
group_by(id, lab) %>%
summarise(
diff_start = if(sum(diff_start <= 0) == 0) NA else max(diff_start[diff_start <= 0], na.omit = TRUE),
diff_end = if(sum(diff_end >= 0) == 0) NA else min(diff_end[diff_end >= 0], na.omit = TRUE)
) %>%
ungroup()