【问题标题】:How to edit values based on another column's value如何根据另一列的值编辑值
【发布时间】:2021-04-01 13:20:40
【问题描述】:

我想选择性地编辑前缀为 grade 的列。我只想保留days 等于"0 days""1 days" 的这些列的值。我想将其余的值分配为NA

我曾尝试使用mutateifelse,但无法正确组合。

data <- data.frame(
"grade_a" = c(1,3,4,2,3), 
"grade_b" = c(8,6,5,7,8), 
"name_c" = c("Sarah", "Joe", "Dave", "Annie", "Thomas"), 
"days" = c("0 days", "4 days", "5 days", "1 days", "0 days"))

This is the output I am looking for:

results <- data.frame(
"grade_a" = c(1,NA,NA,2,3), 
"grade_b" = c(8,NA,NA,7,8), 
"name_c" = c("Sarah", "Joe", "Dave", "Annie", "Thomas"), 
"days" = c("0 days", "4 days", "5 days", "1 days", "0 days"))

【问题讨论】:

    标签: r dataframe dplyr tidyr


    【解决方案1】:

    我们可以使用across:

    library(tidyverse)
    
    data %>%
        mutate(across(starts_with("grade"),
                      ~ifelse(days %in% c("0 days", "1 days"), ., NA)))
    
    #   grade_a grade_b name_c   days
    # 1       1       8  Sarah 0 days
    # 2      NA      NA    Joe 4 days
    # 3      NA      NA   Dave 5 days
    # 4       2       7  Annie 1 days
    # 5       3       8 Thomas 0 days
    

    【讨论】:

      【解决方案2】:

      你也可以使用case_when,就像你提到的那样:

      data %>%
        rowwise() %>%
        mutate(across(grade_a:grade_b, ~ case_when(
          days %in% c("0 days", "1 days") ~ .x,
          TRUE ~ as.double(NA)
        )))
      
      # A tibble: 5 x 4
      # Rowwise: 
        grade_a grade_b name_c days  
          <dbl>   <dbl> <chr>  <chr> 
      1       1       8 Sarah  0 days
      2      NA      NA Joe    4 days
      3      NA      NA Dave   5 days
      4       2       7 Annie  1 days
      5       3       8 Thomas 0 days
      
      

      【讨论】:

        【解决方案3】:

        你可以像这样使用across函数:

        library(dplyr)
        data %>% mutate(across(.cols = starts_with("grade"),.fns = ~if_else(days %in%c("0 days","1 days"),.,NA_real_)))
        

        【讨论】:

        • 这是我答案的几乎完全相同的副本。
        • 是真的,哈哈。我向你保证我没有看到你的答案。
        猜你喜欢
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-31
        • 1970-01-01
        • 2022-12-06
        • 2021-12-18
        • 2016-08-13
        相关资源
        最近更新 更多