首页 > 解决方案 > 在不合并的情况下提取值并找到最小值

问题描述

我正在尝试提取一个潜文本并从 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 的初学者,但很想进一步改进。太感谢了!

标签: rlist

解决方案


一种选择是提取 之后的数字:,将其转换为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))

推荐阅读