【问题标题】:Extracting value and finding the minimum without merging在不合并的情况下提取值并找到最小值
【发布时间】:2019-12-18 17:53:57
【问题描述】:

我正在尝试提取一个潜台词并从 R 中的列表中获取最小值。我的初始 tsv 看起来像这样(这是一个较小的版本):

cases                                              counts
"S35718:10.63,S35585:6.75,S35708:7.28,S36617:12.23" "6.75,7.28,10.63,12.23,6.17,4.09,3.95,5.00"
"S35718:10.63"                                      "10.63"

我试图提取冒号后面的数字并找到最小值,然后我想看看计数列中有多少大于最小值。

例如,我的理想输出是:

min: 6.75
greater than 6.75 in counts column: 4

在这个 .tsv 中,大约有 100,000 行。我尝试过使用 gsub,但它最终会合并所有数字,如下例所示:

test <- gsub(".*:", "",outlier$cases)
[1]"10.63" "6.75" "7.28" "12.23" "10.63" ... all the other subsequent values

我将不胜感激这方面的任何帮助。我是 R 的初学者,但很想进一步改进。非常感谢!

【问题讨论】:

    标签: r list


    【解决方案1】:

    一种选择是提取: 之后的数字,将其转换为numeric,获取min,然后通过创建逻辑表达式找到计数并获取sum

    library(stringr)
    library(dplyr)
    library(purrr)
    library(tidyr)
    outlier %>% 
        transmute(caselist =  str_extract_all(cases, "(?<=:)\\d+\\.\\d+"), 
                  countlist = str_extract_all(counts, "[0-9.]+")) %>%
        transmute(out = map2(caselist, countlist,
             ~tibble(min = min(as.numeric(.x)), 
                     greater_than_min = sum(as.numeric(.y) >= min)))) %>%
         unnest_wider(c(out))
    # A tibble: 2 x 2
    #   min greater_than_min
    #  <dbl>            <int>
    #1  6.75                4
    #2 10.6                 1
    

    数据

    outlier <- structure(list(cases = c("S35718:10.63,S35585:6.75,S35708:7.28,S36617:12.23", 
    "S35718:10.63"), counts = c("6.75,7.28,10.63,12.23,6.17,4.09,3.95,5.00", 
    "10.63")), class = "data.frame", row.names = c(NA, -2L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 2021-05-17
      • 2014-02-14
      • 2020-01-08
      相关资源
      最近更新 更多