根据两个同时条件(阈值和计数)分配因子水平

时间:2018-11-06 20:29:21

标签: r dplyr tidyr

我需要基于一组属性中特定观察值满足特定阈值的次数来指定因子级别(在新列中)。

这里是物种数据库(n = 26)和几个属性(n = 6)的示例。我想基于属性集中特定观察值满足特定阈值多少次来添加新列/变量。如果有基于tidyverse逻辑的解决方案,那就太好了

具有26种和6种属性的数据库

at1 <- rnorm(26,2,1)
at2 <- rnorm(26,1.6,1.2)
at3 <- rnorm(26,2,1)
at4 <- rnorm(26,1.6,1.2)
at5 <- rnorm(26,2,1)
at6 <- rnorm(26,1.6,1.2)
sp <-paste("sp_", letters, sep="")
data<-data.frame(sp,at1,at2,at3,at4,at5,at6)

条件1:如果至少三个属性超过阈值3,则分配“高”级别

条件2:如果至少三个属性超过阈值2.5,则分配“中等”级别

如果以上条件均不满足,则分配“低”

1 个答案:

答案 0 :(得分:0)

当列值取决于多个条件时,dplyr函数case_when很有用。

# set.seed(4)

> data %>% 
    gather(key, value, -sp) %>%
    group_by(sp) %>%
    mutate(threshold = case_when(
        sum(value > 3.0) > 2 ~ 'high', 
        sum(value > 2.5) > 2 ~ 'moderate',
        TRUE                 ~ 'low')
    ) %>%
    spread(key, value)

# A tibble: 26 x 8
# Groups:   sp [26]
   sp    threshold   at1    at2   at3     at4   at5    at6
   <fct> <chr>     <dbl>  <dbl> <dbl>   <dbl> <dbl>  <dbl>
 1 sp_a  low       2.22   3.11  1.92   0.644  2.04   2.89 
 2 sp_b  low       1.46   2.69  2.44   1.54   0.274  2.40 
 3 sp_c  high      2.89   0.486 3.97   3.14   3.56   0.442
 4 sp_d  moderate  2.60   3.09  1.40   1.34   2.78  -0.770
 5 sp_e  low       3.64   1.78  1.45   0.910  0.901  0.898
 6 sp_f  moderate  2.69   2.86  2.70  -0.165  0.272  2.76 
 7 sp_g  low       0.719  0.695 1.84   0.361  2.43   2.26 
 8 sp_h  low       1.79  -0.179 3.35   0.0322 2.74   1.50 
 9 sp_i  moderate  3.90   2.63  0.931  0.594  2.87  -0.412
10 sp_j  high      3.78   1.11  3.06   0.243  2.31   3.06 
# ... with 16 more rows