在具有负数和正数的数据框中查找最大负数和最小正数

时间:2020-05-22 14:39:04

标签: r dplyr tidyverse

我想获取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

我所做的:

  • 将数据拆分为2,然后过滤<= 0的{​​{1}}和diff_start的{​​{1}}
  • 获取感兴趣的摘要,然后将其合并回

我认为这很长且效率很低,希望使其更加简洁。

>= 0

2 个答案:

答案 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()