使用过滤器功能从数据集中删除缺失值的问题

时间:2019-11-08 09:36:26

标签: r dataframe filter dplyr na

我必须删除所有至少包含这些变量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

3 个答案:

答案 0 :(得分: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内部,总是使用&来连接各种条件。

如果您想保留不是所有四列都为NA的那一行,请使用:

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

答案 1 :(得分:0)

如果您想使用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。管道%>%还可让您获得更简洁的代码!

下次,请尝试使用您的数据或一些示例数据提供可复制的示例,以便更好地理解。

答案 2 :(得分:0)

这可能适合您的情况

CW_data_noNA <- CW_data %>% drop_na()