【问题标题】:R function to remove all rows with at leat one NA doesn't work using dplyr使用 dplyr 删除具有至少一个 NA 的所有行的 R 函数不起作用
【发布时间】:2020-10-04 10:55:56
【问题描述】:

你能帮我看看为什么我的功能不起作用吗?给定这张表,my_df

  sexo edad
1    m   23
2    f   34
3   NA   34
4    f   NA
5    m   33

我想创建一个函数,删除带有 NA 字段的每一行,以将其用于不同的数据帧。我做了这个功能:

filter_out_nas = function(df){
  vars = names(df)
  for(var in vars){
    print(var)
    df = filter(df, !is.na(var))
  }
  return(df)
}

我希望输出如下所示:

  sexo edad
1    m   23
2    f   34
5    m   33

但是,当我尝试在my_df 上使用该功能时,它什么也没做:

library(dplyr)
my_df = filter_out_nas(m_df)
## returs the same table given above, `my_df` does not change. 

非常感谢您的宝贵时间

【问题讨论】:

  • 你能澄清你的问题吗?您最初提供的数据看起来与您的预期结果完全相同。如果我理解正确,您想从数据框中删除所有具有 NA 值的行,并将这些行存储在新的数据框中?
  • 很抱歉我已经更正了
  • 这应该可以na.omit(df)

标签: r function dplyr na


【解决方案1】:

对于此处的基本 R 选项,您可以将 rowSumsis.na 一起使用:

df[rowSums(is.na(df)) == 0, ]

  sexo edad
1    m   23
2    f   34
5    m   33

数据:

df <- data.frame(sexo=c("m", "f", NA, "f", "m"), edad=c(23,34,34,NA,33))

【讨论】:

    【解决方案2】:

    我不太清楚你想要什么,所以这里有两件事可能会有所帮助。

    首先:从您的数据框中删除所有具有NA 的行。

    library(tidyr)
    df_no_NA <- drop_na(df)
    

    第二步:创建一个新的数据框,其中只有具有NA 的行。

    library(dplyr)
    df_only_NA <- filter_all(df, ~!is.na(.))
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您可以通过简单的方式做到这一点!

      my_df<- my_df[rowSums(is.na(my_df)) == 0,]
      

      如果你有 " " (空) 值和 NA 你可以使用

      my_df<- my_df[rowSums(is.na(my_df)| my_df=="") == 0,]
      

      【讨论】:

        【解决方案4】:

        最简单的解决方案应该是na.omit(df)

        【讨论】:

          猜你喜欢
          • 2021-05-02
          • 2017-05-27
          • 2018-10-12
          • 1970-01-01
          • 1970-01-01
          • 2019-09-14
          • 2020-10-01
          • 2019-11-14
          • 2018-12-15
          相关资源
          最近更新 更多