【问题标题】:Check whether in specific columns all elements of rows are NA检查特定列中的所有行元素是否为 NA
【发布时间】:2019-11-25 10:57:34
【问题描述】:

如果 my_var_a 到 my_var_c 都是 NA,我希望 my_var 为 0

# A tibble: 4 x 5
  my_var my_var_a my_var_b my_var_c my_var_others
   <int>    <int>    <int>    <int>         <int>
1      0       NA       NA       NA            NA
2      1       NA        1       NA            NA
3      0       NA       NA       NA            NA
4     NA       NA       NA       NA            NA

我得到了我想要的结果:

library(tidyverse)

df %>% mutate(my_var = if_else(apply(select(., my_var_a:my_var_c), 1, function(x) all(is.na(x))), 0L, my_var))

有没有更简单的方法来做到这一点,或者至少是使用purrr 的方法?我查看了pmap,但无法弄清楚它将如何取代 apply。

结果:

  my_var my_var_a my_var_b my_var_c my_var_others
   <int>    <int>    <int>    <int>         <int>
1      0       NA       NA       NA            NA
2      1       NA        1       NA            NA
3      0       NA       NA       NA            NA
4      0       NA       NA       NA            NA 

这是数据框:

structure(list(my_var = c(0L, 1L, 0L, NA), my_var_a = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), my_var_b = c(NA, 1L, 
NA, NA), my_var_c = c(NA_integer_, NA_integer_, NA_integer_, 
NA_integer_), my_var_others = c(NA_integer_, NA_integer_, NA_integer_, 
NA_integer_)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-4L))

【问题讨论】:

    标签: r apply purrr


    【解决方案1】:

    我们可以使用 purrr 中的 pmap_int 逐行遍历多个列。

    library(dplyr)
    library(purrr)
    
    df %>% mutate(my_var = pmap_int(select(., my_var_a:my_var_c), ~any(!is.na(c(...)))))
    
    #  my_var my_var_a my_var_b my_var_c my_var_others
    #   <int>    <int>    <int>    <int>         <int>
    #1      0       NA       NA       NA            NA
    #2      1       NA        1       NA            NA
    #3      0       NA       NA       NA            NA
    #4      0       NA       NA       NA            NA
    

    在基数 R 中,我们可以使用 rowSums 并将 1 分配给至少有一个非 NA 值的行。

    cols <- paste0("my_var_",letters[1:3])
    df$my_var <- +(rowSums(is.na(df[cols])) < length(cols))
    

    【讨论】:

      【解决方案2】:

      检查all(is.na(x)) 会在您想要0 的位置生成TRUE,因此请在前面使用!^1 转换为 "numeric"。在基础 R 中相当简单。

      dat <- transform(dat, my_var=apply(dat[-1], 1, function(x) !all(is.na(x)))^1)
      dat
      #   my_var my_var_a my_var_b my_var_c my_var_others
      # 1      0       NA       NA       NA            NA
      # 2      1       NA        1       NA            NA
      # 3      0       NA       NA       NA            NA
      # 4      0       NA       NA       NA            NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 2020-02-10
        • 1970-01-01
        • 1970-01-01
        • 2018-12-02
        • 2011-04-20
        • 2011-07-13
        相关资源
        最近更新 更多