如何根据R中的某个阈值对值进行分类



我有一个D Data.frame,它具有Stations的值。我确实有另一个data.frame F,它对于某些条件(Ie., WBN, AN etc)具有Stations阈值。我想使用D中每个Stations的值来查看它在哪些条件下属于F,并保存D data.fram e,为DF中的Conditions添加一列。这是我的样本代码

library(tidyverse)
set.seed(123)
D <- data.frame(Stations = c("A","S","D","Z"), Value = c(15,10,25,16))
F <- data.frame(Stations = c("A","S","D","Z"), WBN = runif(4, 0, 3), BN = runif(4, 3,6),
                N = runif(4,7,10), AN = runif(4,15,25))

所需输出我应该得到一个类似的数据帧

DF <- D %>% mutate(Condition = c("AN", "AN", "AN", "AN" ))

来自我的实际数据的样本。帧数据。在上面的示例中,帧Freq可以被认为是F,而Max_2020可以被认为为D

> head(Freq, 5)
# A tibble: 5 x 9
  Stations `1:2` `1:5`              `1:10` `1:25` `1:50` `1:100`            `1:200`            `1:500`
  <chr>    <chr> <chr>              <chr>  <chr>  <chr>  <chr>              <chr>              <chr>  
1 05EF001  911   1550               2180   3350   4410   5860               7730               11100  
2 05EG004  2.7   6.6                11     18     24     33                 43                 60     
3 05FF003  7.24  35.409999999999997 63.26  100.17 124.95 145.86000000000001 162.72999999999999 179.29 
4 05GC006  12.44 38.85              63.11  98.12  125.51 152.86000000000001 179.63             213.48 
5 05GD002  1.38  4.03               6.33   9.65   12.33  15.14              20.170000000000002 29.56  
> head(Max_2020, 5)
# A tibble: 5 x 2
  Stations Value
  <chr>    <dbl>
1 05EG004   9.18
2 05FF003  38.7 
3 05GC006  15.8 
4 05GD002   2.65
5 05GF002  57.2 

我的目标是在Max_2020中添加另一列,并根据Value位于Freq中的条件进行填充。换句话说,例如,如果Max_2020中的Value小于Freq中的列1:2下的数字,则我将为特定站将1:2分配给Max_2020中的新列。对于特定的stations,需要在Freq中的所有列中检查Max_2020中的值,然后为其分配相应的条件。

您可以获得长格式的F,通过Stations将其与D连接,并为每个Stations保留Value交叉的行。

library(dplyr)
Freq %>%
  pivot_longer(cols = -Stations) %>%
  mutate(value = as.numeric(value)) %>%
  left_join(Max_2020, by = 'Stations') %>%
  group_by(Stations) %>% 
  slice(which(value > Value)[1] - 1) %>%
  select(Stations, name) %>%
  right_join(Max_2020, by = 'Stations')

最新更新