R 有条件地替换NA

R 有条件地替换NA,r,dplyr,R,Dplyr,这是我自己的补充版本,因为我无法通过评论清楚地解释它 只有2个农场,因此每个水果在下面的df中重复。我想用0替换NA,只要其中一种水果有一个值,比如在y2019的pear中有一个c(NA,7),我想输出c(0,7) 样本数据: 但是: 7在pear生产c(0,0)中被消灭 当两个农场都是NA #A tibble: 8 x 5 fruit farm y2019 y2018 y2017 <chr> <fct> <dbl> <dbl>

这是我自己的补充版本,因为我无法通过评论清楚地解释它

只有2个
农场
,因此每个
水果
在下面的
df
中重复。我想用
0
替换
NA
,只要其中一种水果有一个值,比如在
y2019
pear
中有一个
c(NA,7)
,我想输出
c(0,7)

样本数据:

但是:

  • 7
    pear
    生产
    c(0,0)
    中被消灭

  • 当两个农场都是
    NA

      #A tibble: 8 x 5
       fruit farm  y2019 y2018 y2017
       <chr> <fct> <dbl> <dbl> <dbl>
     1 apple 1         0     5     4
     2 apple 2         0     3     5
     3 peach 1         3     0     7
     4 peach 2        12     0    15
     5 pear  1         0     8     0
     6 pear  2         0     2     0
     7 lime  1         4     0     0
     8 lime  2         6     0     0
    
    您可以尝试:

    library(dplyr)
    
    df %>%
      group_by(fruit) %>%
      mutate(across(where(is.numeric), ~ if(any(!is.na(.))) 
                    replace(., is.na(.), 0)  else .)) %>%
      ungroup()
    
    # A tibble: 8 x 5
    #  fruit farm  y2019 y2018 y2017
    #  <chr> <fct> <dbl> <dbl> <dbl>
    #1 apple 1        NA     5     4
    #2 apple 2        NA     3     5
    #3 peach 1         3    NA     7
    #4 peach 2        12    NA    15
    #5 pear  1         0     8    NA
    #6 pear  2         7     2    NA
    #7 lime  1         4    NA     1
    #8 lime  2         6    NA     0
    
    库(dplyr)
    df%>%
    组别(水果)%>%
    变异(跨越(其中(is.numeric),~if(any(!is.na())
    替换(,is.na(.),0)其他。))%>%
    解组()
    #一个tibble:8x5
    #水果场y2019 y2018 y2017
    #      
    #1苹果1 NA 5 4
    #2苹果2 NA 3 5
    #3桃13NA 7
    #4桃2 12娜15
    #5梨1 0 8 NA
    #6梨2 7 2 NA
    #7石灰1 4钠1
    #8石灰2 6钠0
    
    因此,只有当组中有任何值不是
    NA

    时,我们才
    替换为0。您可以尝试:

    library(dplyr)
    
    df %>%
      group_by(fruit) %>%
      mutate(across(where(is.numeric), ~ if(any(!is.na(.))) 
                    replace(., is.na(.), 0)  else .)) %>%
      ungroup()
    
    # A tibble: 8 x 5
    #  fruit farm  y2019 y2018 y2017
    #  <chr> <fct> <dbl> <dbl> <dbl>
    #1 apple 1        NA     5     4
    #2 apple 2        NA     3     5
    #3 peach 1         3    NA     7
    #4 peach 2        12    NA    15
    #5 pear  1         0     8    NA
    #6 pear  2         7     2    NA
    #7 lime  1         4    NA     1
    #8 lime  2         6    NA     0
    
    库(dplyr)
    df%>%
    组别(水果)%>%
    变异(跨越(其中(is.numeric),~if(any(!is.na())
    替换(,is.na(.),0)其他。))%>%
    解组()
    #一个tibble:8x5
    #水果场y2019 y2018 y2017
    #      
    #1苹果1 NA 5 4
    #2苹果2 NA 3 5
    #3桃13NA 7
    #4桃2 12娜15
    #5梨1 0 8 NA
    #6梨2 7 2 NA
    #7石灰1 4钠1
    #8石灰2 6钠0
    

    因此,只有当组中有任何值不是
    NA

    时,我们才
    替换为0。如果有
    任何
    非NA元素要替换为0或
    其他
    返回值,我们可以使用
    替换
    来自
    替换为0

    library(dplyr)
    library(tidyr)
    df %>%
      group_by(fruit) %>%
      mutate(across(where(is.numeric), ~ if(any(!is.na(.))) replace_na(., 0) else .)) %>%
       ungroup()
    # A tibble: 8 x 5
    #  fruit farm  y2019 y2018 y2017
    #  <chr> <fct> <dbl> <dbl> <dbl>
    #1 apple 1        NA     5     4
    #2 apple 2        NA     3     5
    #3 peach 1         3    NA     7
    #4 peach 2        12    NA    15
    #5 pear  1         0     8    NA
    #6 pear  2         7     2    NA
    #7 lime  1         4    NA     1
    #8 lime  2         6    NA     0
    

    如果有
    任何
    非na元素要替换为0或
    否则
    返回值,我们可以使用
    替换na
    from
    tidyr

    library(dplyr)
    library(tidyr)
    df %>%
      group_by(fruit) %>%
      mutate(across(where(is.numeric), ~ if(any(!is.na(.))) replace_na(., 0) else .)) %>%
       ungroup()
    # A tibble: 8 x 5
    #  fruit farm  y2019 y2018 y2017
    #  <chr> <fct> <dbl> <dbl> <dbl>
    #1 apple 1        NA     5     4
    #2 apple 2        NA     3     5
    #3 peach 1         3    NA     7
    #4 peach 2        12    NA    15
    #5 pear  1         0     8    NA
    #6 pear  2         7     2    NA
    #7 lime  1         4    NA     1
    #8 lime  2         6    NA     0
    
    library(dplyr)
    library(tidyr)
    df %>%
      group_by(fruit) %>%
      mutate(across(where(is.numeric), ~ if(any(!is.na(.))) replace_na(., 0) else .)) %>%
       ungroup()
    # A tibble: 8 x 5
    #  fruit farm  y2019 y2018 y2017
    #  <chr> <fct> <dbl> <dbl> <dbl>
    #1 apple 1        NA     5     4
    #2 apple 2        NA     3     5
    #3 peach 1         3    NA     7
    #4 peach 2        12    NA    15
    #5 pear  1         0     8    NA
    #6 pear  2         7     2    NA
    #7 lime  1         4    NA     1
    #8 lime  2         6    NA     0
    
    df %>%
         group_by(fruit) %>%
          mutate(across(where(is.numeric),
               ~ replace(., sum(!is.na(.)) > 0 & is.na(.), 0)))
    # A tibble: 8 x 5
    # Groups:   fruit [4]
    #  fruit farm  y2019 y2018 y2017
    #  <chr> <fct> <dbl> <dbl> <dbl>
    #1 apple 1        NA     5     4
    #2 apple 2        NA     3     5
    #3 peach 1         3    NA     7
    #4 peach 2        12    NA    15
    #5 pear  1         0     8    NA
    #6 pear  2         7     2    NA
    #7 lime  1         4    NA     1
    #8 lime  2         6    NA     0