r - 在大于 R 中另一列的数组中查找最小值

标签 r rowwise

我需要找到比另一列中的值大的三列的最小值。假设这五个人在一年中的不同月份入院,他们在住院前后多次心脏病发作。我需要住院后的第一次心脏病发作。


id<-c(100,105,108,200,205)
hosp<-c(3,5,2,6,2)
attack1<-c(1,6,3,4,1)
attack2<-c(4,7,9,10,NA)
attack3<-c(5,10,NA,NA,NA)
out<-c(7,12,11,12,9)

data <- data.frame(id,hosp,attack1,attack2,attack3,out)

   id hosp attack1 attack2 attack3 out
1 100    3       1       4       5   7
2 105    5       6       7      10  12
3 108    2       3       9      NA  11
4 200    6       4      10      NA  12
5 205    2       1      NA      NA   9
所以数据最终应该看起来像
   id hosp attack1 attack2 attack3 out afterh
1 100    3       1       4       5   7      4
2 105    5       6       7      10  12      6
3 108    2       3       9      NA  11      3
4 200    6       4      10      NA  12     10
5 205    2       1      NA      NA   9     NA
这是我没有成功的尝试:
min_f<-function(a){
  x<-min(a[a>hosp])
}

data %>% mutate_if(vars(attack1,attack2,attack3),min_f())

最佳答案

您可以使用以下解决方案。

  • 这里 c(...) 指的是数据集每一行中的所有变量,我只选择了那些以 attack 开头的变量。
  • 然后我只选择了那些大于 hosp 的对应值的值。在每一行中,因为您正在寻找大于 hosp 的值的第一个我用过 first提取该函数的函数
  • ..2也指第二个变量hosp的值每行
  • library(dplyr)
    library(purrr)
    
    data %>%
      mutate(afterh = pmap_dbl(., ~ {x <- c(...)[3:5]; 
      first(sort(x[x > ..2]))}))
    
       id hosp attack1 attack2 attack3 out afterh
    1 100    3       1       4       5   7      4
    2 105    5       6       7      10  12      6
    3 108    2       3       9      NA  11      3
    4 200    6       4      10      NA  12     10
    5 205    2       1      NA      NA   9     NA
    
    作为@Greg 先生在一个非常大的数据集中提到的替代方案,我们可以使用 min函数代替 first(sort))以确保更快地评估以下解决方案。如果没有大于 hosp 的值就像最后一行 min函数将返回 Inf所以我确保它会返回值 0相反,您可以使用您喜欢的值更改它:
    data %>%
      mutate(afterh = pmap_dbl(., ~ {x <- c(...)[3:5];
      out <- min(x[x > ..2], na.rm = TRUE);
      if(!is.finite(out)) 0 else out}))
    
       id hosp attack1 attack2 attack3 out afterh
    1 100    3       1       4       5   7      4
    2 105    5       6       7      10  12      6
    3 108    2       3       9      NA  11      3
    4 200    6       4      10      NA  12     10
    5 205    2       1      NA      NA   9      0
    

    关于r - 在大于 R 中另一列的数组中查找最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67940482/

    相关文章:

    R Shiny - 如何使用操作按钮在两个不同的绘图之间切换

    r - 使用Rocker调试R软件包(如何更改版本?)

    r - 当同一行中有多个 "."参数时如何使用 mutate c_across

    R 避免 rowwise() 并寻找更快的替代方案

    r - 根据匹配字符串或跨列子集的 NA 逐行进行变异

    r - 基于一个列模态和其他列的新列

    R: dplyr 管道条件超前/滞后使用 ifelse 具有意外行为

    r - 如何在 R 中的管道中使用 dplyr 的 rowwise() 来应用向每行返回列表的函数?

    使用 mutate 和 rowwise 返回列表

    r - 使用正则表达式分隔列