【问题标题】:filtering data frame based on NA on multiple columns在多列上基于 NA 过滤数据框
【发布时间】:2021-02-02 16:08:53
【问题描述】:

我有以下数据框,我们称之为df,并附有以下观察结果:

id   type   company
1    NA      NA
2    NA      ADM
3    North   Alex
4    South   NA
NA   North   BDA
6    NA      CA

我只想保留“类型”和“公司”列中没有 NA 的记录。

id   type   company
3    North   Alex
NA   North   BDA

我试过了:

 df_non_na <- df[!is.na(df$company) || !is.na(df$type), ]

但这不起作用。

提前致谢

【问题讨论】:

  • df [ complete.cases(df), ] ?
  • 或前一个带有单个 | 。即:df[!is.na(df$company) | !is.na(df$type), ]
  • 我认为这将消除“id”为 NA 的情况
  • 也可以试试library(data.table) ; na.omit(setDT(df), cols = c("type", "company"))
  • @大卫,谢谢

标签: r dataframe


【解决方案1】:

使用dplyr,也可以使用filter_at函数

library(dplyr)
df_non_na <- df %>% filter_at(vars(type,company),all_vars(!is.na(.)))

all_vars(!is.na(.)) 表示列出的所有变量都必须不是 NA。

如果你想保留至少有一个值的行,你可以这样做:

df_non_na <- df %>% filter_at(vars(type,company),any_vars(!is.na(.)))

【讨论】:

  • 此答案适用于您也希望将此过滤器应用于除某些列之外的所有列的情况。例如,如果您使用了(vars(-type,-company),您就可以免除类型和公司变量不必不是 na。
【解决方案2】:

我们可以获得两列的逻辑索引,使用&amp; 并对行进行子集化。

df1[!is.na(df1$type) & !is.na(df1$company),]
# id  type company
#3  3 North    Alex
#5 NA North     BDA

或者在逻辑矩阵 (is.na(df1[-1])) 上使用rowSums 进行子集化。

df1[!rowSums(is.na(df1[-1])),]

【讨论】:

  • Dena 回答了这个问题,我所要做的就是使用“|”而不是“||”,
  • 但是 1 | 没有给你想要的输出。
  • @user3875610 我从df1[!is.na(df1$company) | !is.na(df1$type), ]得到6行
  • @akrun 为什么我们不能在这里使用|?为什么&amp;?我认为&amp; 仅指定两列是否都有NA
  • @MAPK 这有点逆向逻辑。我猜这和德摩根定律的逻辑是一样的
【解决方案3】:

您需要 AND 运算符 (&),而不是 OR (|) 我还强烈建议使用 dplyr 函数 filter() 和管道运算符 %>% 来使用 tidyverse 方法,同样来自 dplyr:

library(dplyr)
df_not_na <- df %>% filter(!is.na(company) & !is.na(type))

【讨论】:

    【解决方案4】:

    你会想要使用drop_na()

    library(dplyr)
    
    new_df <- df %>% drop_na(type, company)
    
    

    【讨论】:

      【解决方案5】:

      dplyracross() 的示例,因为 filter_at() 已被取代

      library(dplyr)
      
      df_non_na <- df %>% filter(across(c(type,company), ~ !is.na(.)))
      

      【讨论】:

        【解决方案6】:

        你可以使用

        na.omit(data_frame_name)
        

        【讨论】:

        • 这将消除具有 any NA 值的行——接受的答案已经完成,问题已经解决。
        猜你喜欢
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 2020-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多