【问题标题】:Conditional mutate to assign a new colour with dplyr in R条件突变以在 R 中使用 dplyr 分配新颜色
【发布时间】:2021-01-29 11:18:06
【问题描述】:

我有一个看起来像这样的数据框

value <- c(0,0.1,0.2,0.4,0,0.05,0.05,0.5)
time <- c(0,0,0,0,1,1,1,1)
ID <- c(1,2,3,4,1,2,3,4)

test <- data.frame(value, time, ID)

 value time ID
1  0.00    0  1
2  0.10    0  2
3  0.20    0  3
4  0.40    0  4
5  0.00    1  1
6  0.05    1  2
7  0.05    1  3
8  0.50    1  4

我想当时间点 '0' 的值大于 0.1 时分配颜色“红色” 到所有 ID 值,当值小于 0.1 时分配颜色“蓝色” 我希望我的 data.frame 看起来像这样

 value time ID  color
1  0.00    0  1 blue
2  0.10    0  2 blue 
3  0.20    0  3 red
4  0.40    0  4 red
5  0.00    1  1 blue
6  0.05    1  2 blue
7  0.05    1  3 red
8  0.50    1  4 red

这是我迄今为止尝试过的,但我没有得到所有时间点的颜色

test %>% 
  group_by(ID) %>% 
  mutate(color = case_when(value > 0.1 & time ==0 ~ "red", 
                           value < 0.1 & time ==0 ~ "blue"))

非常感谢任何提示

更新::编辑


我看到的一种方法是添加

test %>% 
  group_by(ID) %>% 
  mutate(color = case_when(value > 0.1 & time ==0 ~ "red", 
                           value < 0.1 & time ==0 ~ "blue"))%>% 
 tidyr:fill(color, .diretction ="updown") 

还有其他建议吗?

【问题讨论】:

    标签: r dplyr tidyverse tidyr


    【解决方案1】:

    你试过 if_else() 吗?

    test %>% 
      mutate(color = if_else(value > 0.1 & time ==0,"red","blue"))
    

    或者,嵌套 if_else() 更进一步:

    test %>% mutate(color = if_else(value > 0.1 & time ==0,
                                   "red",
                                   if_else(time == 0,
                                           "blue",
                                           "0")
                                   )
                   )
    

    如果规则对整个 ID 组是通用的,您可以使用组的 max()(或 min())吗?

    test %>%
      group_by(ID) %>% 
      mutate(color = if_else(max(value) > 0.1 & time ==0,
                                   "red",
                                   if_else(time == 0,
                                           "blue",
                                           "not 0")
                                   )
                   )
    

    将 ID == 1 的数据更改为高于 0.1 和低于 0.1 的值使这一点更加明显:

    library(dplyr)
    
    value <- c(2,0.1,0.2,0.4,0,0.05,0.05,0.5)
    time <- c(0,0,0,0,0,1,1,1)
    ID <- c(1,2,3,4,1,2,3,4)
    
    test <- data.frame(value, time, ID)
    
    test %>%
      group_by(ID) %>% 
      mutate(color = if_else(min(value) > 0.1 & time ==0,
                             "red",
                             if_else(time == 0,
                                     "blue",
                                     "not 0")
      )
      )
    
      value  time    ID color
      <dbl> <dbl> <dbl> <chr>
    1  2        0     1 blue 
    2  0.1      0     2 blue 
    3  0.2      0     3 blue 
    4  0.4      0     4 red  
    5  0        0     1 blue 
    6  0.05     1     2 not 0
    7  0.05     1     3 not 0
    8  0.5      1     4 not 0
    

    【讨论】:

    • 亲爱的 Palandic, 感谢您抽出宝贵时间,但我认为这对我不起作用。我希望将 ID 的颜色转移到下一个时间点
    • 您好 LDT,是说 ID 的颜色应该是一致的吗?因为这就是我添加 max() 或 min() 的原因,具体取决于方向。
    • 对对对
    • 在分组条件下使用 min() 或 max() 不起作用吗?
    • 很遗憾没有。不过我需要再检查一次,你能不能也检查一下,以免不公平
    【解决方案2】:
      group_by(ID) %>% 
      mutate(color = case_when(value > 0.1 & time ==0 ~ "red", 
                               value < 0.1 & time ==0 ~ "blue"))%>% 
     tidyr:fill(color, .diretction ="updown")```
    

    【讨论】:

      猜你喜欢
      • 2016-03-13
      • 2015-01-28
      • 1970-01-01
      • 2021-10-26
      • 2021-04-15
      • 2019-07-25
      • 1970-01-01
      • 2019-03-10
      • 2015-12-08
      相关资源
      最近更新 更多