【问题标题】:Find max negative and min positive numbers in a dataframe with negatives and positives在具有负数和正数的数据框中查找最大负数和最小正数
【发布时间】:2020-05-22 14:39:04
【问题描述】:

我想在 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份,过滤&lt;= 0diff_start&gt;= 0diff_end
  • 获取感兴趣的摘要,然后将它们合并回来

我认为这很长而且效率很低,并希望使它更简洁。

full_join(
  data %>% 
    group_by(id, lab) %>% 
    filter(diff_start <= 0) %>% 
    summarise(diff_start = max(diff_start)) %>% 
    ungroup(),
  data %>% 
    group_by(id, lab) %>% 
    filter(diff_start >= 0) %>% 
    summarise(diff_end = min(diff_end)) %>% 
    ungroup())

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    试一试:

    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
    

    【讨论】:

      【解决方案2】:

      你可以这样分解你的代码:

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

      【讨论】:

      • 如果数据框缺少某些idlab 组合的负值,您知道如何修改此代码,例如data &lt;- read.table(text =" id lab diff_start diff_end 1 hb 0.6 0.5 1 hb 0.7 0.8", header = TRUE)。如果代码能在diff_start下输出NA就好了。
      • @HNSKD 更新了请看一下
      猜你喜欢
      • 2019-09-10
      • 2019-12-14
      • 2018-10-17
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多