首页 > 解决方案 > 在R中的数据框中找到最小值

问题描述

我有一个非常大的数据框(下面的 dput 子集),我需要计算压力(press),其中par是最大值的 1%par

为什么我总是得到所有的NA?

 miss <- function(x) ifelse(is.finite(x),x,NA)
 depth <- test %>% 
 group_by(site,station) %>%
 summarize(
euphotic=miss(min(press[par <= 0.001*max(par)], Inf, na.rm=TRUE))
 )

 depths



 structure(list(station = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), press = c(2L, 8L, 
 12L, 18L, 22L, 26L, 30L, 34L, 40L, 46L, 54L, 60L, 64L, 68L, 74L, 
 78L, 82L, 88L, 92L, 98L, 104L, 108L, 114L, 118L, 124L, 128L, 
 132L, 138L, 142L, 146L, 2L, 8L, 12L, 18L, 22L, 26L, 30L, 34L, 
 40L, 46L, 54L, 60L, 64L, 68L, 74L, 78L, 82L, 88L, 92L, 98L, 104L, 
 108L, 114L, 118L, 124L, 128L, 132L, 138L, 142L, 146L, 2L, 8L, 
 12L, 18L, 22L, 26L, 30L, 34L, 40L, 46L, 54L, 60L, 64L, 68L, 74L, 
 78L, 82L, 88L, 92L, 98L, 104L, 108L, 114L, 118L, 124L, 128L, 
 132L, 138L, 142L, 146L, 2L, 8L, 12L, 18L, 22L, 26L, 30L, 34L, 
 40L, 46L), par = c(58.98732, 31.39843, 20.79014, 11.61261, 7.75838, 
 5.32665, 4.3787, 3.73578, 2.95239, 2.30608, 1.62347, 1.28806, 
 1.09946, 0.93665, 0.734, 0.62545, 0.52283, 0.39962, 0.33383, 
 0.24813, 0.18591, 0.1487, 0.10228, 0.07633, 0.04387, 0.02744, 
 0.01357, 0.00096, 0, 0, NA, 68.57304, 36.01596, 14.94555, 8.8113, 
 5.70737, 3.85764, 2.71274, 1.61768, 0.85245, 0.40941, 0.25115, 
 0.18174, 0.13309, 0.07703, 0.0494, 0.03003, 0.00191, 0, 0, 0, 
 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 23.45076, 12.82472, 5.89698, 3.96756, 
 3.29165, 2.74749, 2.30578, 1.77944, 1.39889, 0.98467, 0.77704, 
 0.65316, 0.55382, 0.42937, 0.34924, 0.29366, 0.2176, 0.17315, 
 0.12327, 0.08098, 0.05937, 0.0341, 0.01787, 0.00258, 0, 0, 0, 
 0, 0, NA, 7.10779, 4.59278, 2.56041, 1.98354, 1.61956, 1.32333, 
 1.10579, 0.83852, 0.62653), par.up = c(107.09531, 42.19624, 30.38343, 
 14.74241, 13.44021, 10.13227, 8.01075, 6.47363, 4.65497, 3.42635, 
 2.46751, 1.94465, 1.65935, 1.42163, 1.06725, 0.90339, 0.76596, 
 0.59094, 0.49598, 0.37735, 0.25879, 0.21226, 0.15326, 0.11898, 
 0.072, 0.05308, 0.03393, 0.01408, 0.00119, 0, 306.39386, 108.48346, 
 61.89079, 26.94455, 16.56027, 10.51363, 6.91425, 4.56686, 2.58844, 
 1.3741, 0.67524, 0.44539, 0.33409, 0.25119, 0.16086, 0.11906, 
 0.06536, 0.02745, 0.0135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48.68698, 
 15.12474, 7.69357, 3.38269, 2.04553, 1.65505, 1.3807, 1.16209, 
 0.91962, 0.7475, 0.51066, 0.3945, 0.32956, 0.27063, 0.20145, 
 0.1658, 0.13006, 0.08018, 0.0589, 0.02948, 0.01075, 0.00014, 
 0, 0, 0, 0, 0, 0, 0, 0, 10.49227, 4.28379, 3.01506, 1.81555, 
 1.37034, 1.07562, 0.89375, 0.77771, 0.62027, 0.47772), site =          
 structure(c(1L, 
 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
 1L, 1L, 1L), .Label = "River", class = "factor")), row.names = c(NA, 
 100L), class = "data.frame")

标签: r

解决方案


您可以filter获取范围内的值并获取该min值。如果您需要最终输出中的所有组组合,请使用complete

library(dplyr)
library(tidyr)

test %>% 
  group_by(site,station) %>%
  filter(par <= 0.001*max(par, na.rm = TRUE)) %>%
  summarize(euphotic= min(press, na.rm = TRUE)) %>%
  ungroup %>%
  complete(site = unique(test$site), station = unique(test$station))

#   site  station euphotic
#  <fct>   <int>    <int>
#1 River       2      124
#2 River       3       78
#3 River       4      118
#4 River       5       NA

推荐阅读