【问题标题】:How to use case_when with entire dataframe?如何将 case_when 与整个数据框一起使用?
【发布时间】:2021-10-24 00:52:54
【问题描述】:

我想将 case_when 应用于数据框中的所有列。

set.seed(1)
data <- tibble(x = runif(10), y = x * 2) 
data

对于所有高于 0.5 的列,我想替换为字符串“>0.5”,对于高于 1 的列,我想替换为“>1”。

我尝试过 case_when,但似乎我必须指定 x 和 y 之类的列。我想在不指定列的情况下使用 case_when,而是在整个数据框上使用它。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    purrr 解决方案;

    library(purrr)
    
    data %>%
    map_df(~case_when(.x > 0.5 & .x < 1 ~ ">0.5",
                      .x >= 1 ~ ">1"))
    

    输出;

       x     y    
       <chr> <chr>
     1 NA    >0.5 
     2 NA    >0.5 
     3 >0.5  >1   
     4 >0.5  >1   
     5 NA    NA   
     6 >0.5  >1   
     7 >0.5  >1   
     8 >0.5  >1   
     9 >0.5  >1   
    10 NA    NA   
    

    【讨论】:

      【解决方案2】:

      这是一个潜在的解决方案:

      library(tidyverse)
      
      set.seed(1)
      data <- tibble(x = runif(10), y = x * 2) 
      data
      #> # A tibble: 10 × 2
      #>         x     y
      #>     <dbl> <dbl>
      #>  1 0.266  0.531
      #>  2 0.372  0.744
      #>  3 0.573  1.15 
      #>  4 0.908  1.82 
      #>  5 0.202  0.403
      #>  6 0.898  1.80 
      #>  7 0.945  1.89 
      #>  8 0.661  1.32 
      #>  9 0.629  1.26 
      #> 10 0.0618 0.124
      
      data %>%
        mutate(across(everything(),
                      ~case_when(.x > 0.5 & .x < 1.0 ~ ">0.5",
                                 .x >= 1.0 ~ ">1")))
      #> # A tibble: 10 × 2
      #>    x     y    
      #>    <chr> <chr>
      #>  1 <NA>  >0.5 
      #>  2 <NA>  >0.5 
      #>  3 >0.5  >1   
      #>  4 >0.5  >1   
      #>  5 <NA>  <NA> 
      #>  6 >0.5  >1   
      #>  7 >0.5  >1   
      #>  8 >0.5  >1   
      #>  9 >0.5  >1   
      #> 10 <NA>  <NA>
      

      reprex package (v2.0.1) 于 2021 年 10 月 24 日创建

      【讨论】:

        【解决方案3】:

        你可以使用cut -

        library(dplyr)
        
        data %>%
          mutate(across(.fns = ~cut(., c(0.5, 1, Inf), c(">0.5", ">1"))))
        
        #    x     y    
        #   <fct> <fct>
        # 1 NA    >0.5 
        # 2 NA    >0.5 
        # 3 >0.5  >1   
        # 4 >0.5  >1   
        # 5 NA    NA   
        # 6 >0.5  >1   
        # 7 >0.5  >1   
        # 8 >0.5  >1   
        # 9 >0.5  >1   
        #10 NA    NA   
        

        在基础 R 中,lapply -

        data[] <- lapply(data, function(x) cut(x, c(0.5, 1, Inf), c(">0.5", ">1")))
        

        【讨论】:

          【解决方案4】:

          我们可以使用if_alleverything()(选择所有列)来创建逻辑向量

          library(dplyr)
          data %>%
               mutate(new = case_when(if_all(everything(),  `>`, 1) ~ ">1", if_all(everything(),  `>`, 0.5) ~ ">0.5")
                            )
          

          -输出

          # A tibble: 10 × 3
                  x     y new  
              <dbl> <dbl> <chr>
           1 0.266  0.531 <NA> 
           2 0.372  0.744 <NA> 
           3 0.573  1.15  >0.5 
           4 0.908  1.82  >0.5 
           5 0.202  0.403 <NA> 
           6 0.898  1.80  >0.5 
           7 0.945  1.89  >0.5 
           8 0.661  1.32  >0.5 
           9 0.629  1.26  >0.5 
          10 0.0618 0.124 <NA> 
          

          注意:作为对整个数据集指定的 OP,这确实会根据对整个数据集的评估创建列


          如果 OP 表示单独的列,请使用 between

          data %>% 
             mutate(across(everything(), 
             ~ case_when(between(.x, 0.5, 1) ~"> 0.5", TRUE ~ "> 1")))
          # A tibble: 10 × 2
             x     y    
             <chr> <chr>
           1 > 1   > 0.5
           2 > 1   > 0.5
           3 > 0.5 > 1  
           4 > 0.5 > 1  
           5 > 1   > 1  
           6 > 0.5 > 1  
           7 > 0.5 > 1  
           8 > 0.5 > 1  
           9 > 0.5 > 1  
          10 > 1   > 1  
          

          如果我们想单独执行此操作

          out <- as.data.frame(data)
          out[] <- case_when(data > 0.5 ~ "> 0.5", data > 1 ~ "> 1")
          

          【讨论】:

            【解决方案5】:

            另一种基本 R 解决方案:

            ff = function(z){x = rep(NA, length(z)); x[z > .5] = ">.5"; x[z > 1] = ">1";z = x }
            sapply(data, ff)
            #      x     y    
            # [1,] NA    ">.5"
            # [2,] NA    ">.5"
            # [3,] ">.5" ">1" 
            # [4,] ">.5" ">1" 
            # [5,] NA    NA   
            # [6,] ">.5" ">1" 
            # [7,] ">.5" ">1" 
            # [8,] ">.5" ">1" 
            # [9,] ">.5" ">1" 
            #[10,] NA    NA   
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-01-19
              • 1970-01-01
              • 2022-09-26
              • 2021-01-25
              • 1970-01-01
              • 1970-01-01
              • 2017-12-02
              • 2021-05-04
              相关资源
              最近更新 更多