【问题标题】:Problem with using filter function to remove missing values from a dataset使用过滤器功能从数据集中删除缺失值的问题
【发布时间】:2020-03-04 22:21:57
【问题描述】:

如果这些变量 Loading Dateyear of builtvessel typecargo size 中至少有一个包含缺失值,我需要删除所有观察结果。

    anyNA(CW_data$`Loading Date`) #result is FALSE, which means there aren't missing values
    anyNA(CW_data$`Year Built`) #result is TRUE, there are missing values
    anyNA(CW_data$`Vessel Type`)#result is TRUE, there are missing values
    anyNA(CW_data$`Cargo Size`)#result is TRUE, there are missing values

    CW_data_noNA <- filter(CW_data, is.na('Year Built')==FALSE |
                   is.na('Vessel Type'==FALSE)|
                   is.na('Cargo Size')==FALSE |
                     is.na('Loading Date') == FALSE)

我尝试使用上述代码,但生成的数据集与原始数据集相同。有人可以解释我做错了什么吗?非常感谢,LMC

【问题讨论】:

  • is.na(`Year Built`) 而不是 is.na('Year Built') 可以正常工作。虽然 is.na 返回一个逻辑值,虽然检查is.na(x) == FALSE 是检查FALSE == FALSETRUE == FALSE,所以你可以只使用!is.na(x)

标签: r dataframe filter dplyr na


【解决方案1】:

你可以使用filter_at:

CW_data_noNA <- filter_at(CW_data, vars('Year Built', 'Vessel Type', 'Cargo Size', 'Loading Date'), 
                            all_vars(!is.na(.)))

如果你想改用filter,你可以这样做:

CW_data_noNA <- CW_data %>% 
                 filter(!is.na('Year Built'), !is.na('Vessel Type'),
                        !is.na('Cargo Size'), !is.na('Loading Date'))

这会保留所有四列都不是NA 的行。 在filter 内部,各种条件始终使用&amp; 连接。

如果您想保留那些并非所有四列都是NA 同时使用的行:

W_data %>% 
   filter(!is.na('Year Built') | !is.na('Vessel Type') |
          !is.na('Cargo Size') | is.na('Loading Date'))

【讨论】:

  • 你知道是否可以用filter()来完成它吗?对不起,我是 r 的初学者
  • 实际上使用第二个代码(带有过滤器的那个)不起作用!它给了我原始数据集。
  • 这意味着没有一行四列都是NA
  • 问题是我需要删除所有行,其中至少有一个包含缺失值的变量。无论如何,你用 filter_at 发给我的那个有效,这意味着可以减少数据集。我只是想知道如何仅使用 filter() 函数来做到这一点。
  • 对不起,我误解了问题并更新了我的答案
【解决方案2】:

如果你想使用filter,你可以这样做:

CW_data_noNA <- CW_data %>% 
    filter(!is.na(`Year Built`) & !is.na(`Vessel Type`) &
           !is.na(`Cargo Size`) & !is.na(`Loading Date`)
           )

当你在列中有奇怪的名字时,你需要使用反引号``。一般来说,我认为最好避免列名使用空格。

关于您提供的代码,is.na 已经返回一个逻辑,因此您可以使用!is.na 而不是is.na() == FALSE。管道%&gt;% 还可以让您获得更清晰的代码!

下一次,尝试提供一个可重复的示例以及您的数据或一些示例数据,以便更好地理解。

【讨论】:

  • 好的,我试试用反引号!也许这就是它不起作用的原因。无论如何,我需要用至少一个包含 NA 的变量来消除所有行。我应该用 & 代替 | ?
  • 感谢有关数据的建议,我是新手,我不知道它有那么重要。
  • @LMC 我认为使用&amp; 您将保留所有非NA 值的行(类似于filter_at 解决方案),但我可能是错的。数据没问题,它只是为了让人们更容易理解他们正在处理的事情。
【解决方案3】:

这可能对你的情况有用

CW_data_noNA <- CW_data %>% drop_na()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多