在数据框的几列上使用过滤器功能删除NA

时间:2019-09-17 20:04:38

标签: r dataframe dplyr

我有一个很大的数据帧,在不同的位置都有NA。我需要删除具有更多NA值的几行。

我使用filter条条件应用了is.na()来删除了它们。但是,他们没有取得丰硕的成果。

S.No    MediaName KeyPress     KPIndex  Type            Secs    X       Y
001     Dat       NA           1        Fixation        18      117     89
002     New       NA           NA       Saccade         33      NA      NA
003     Dat       NA           2        Fixation        23      117     NA    

我的代码

df <- df%>%filter(df, !is.na(KeyPress) & !is.na(KPIndex) & !is.na(X) & !is.na(Y))

我想根据情况使用dplyr删除。在大型数据框中,我有更多与此类似的行。我的代码有什么问题?

3 个答案:

答案 0 :(得分:2)

如果一列以上,请使用filter_at

library(dplyr)     
df %>%
   filter_at(vars(KeyPress, KPIndex, X, Y), any_vars(!is.na(.)))

或者使用rowSums中的base R

nm1 <- c("KeyPress", "KPIndex", "X", "Y")
df[rowSums(!is.na(df[nm1]))!= 0,]

数据

df <- structure(list(S.No = 1:3, MediaName = c("Dat", "New", "Dat"), 
    KeyPress = c(NA, NA, NA), KPIndex = c(1L, NA, 2L), Type = c("Fixation", 
    "Saccade", "Fixation"), Secs = c(18L, 33L, 23L), X = c(117L, 
    NA, 117L), Y = c(89L, NA, NA)), class = "data.frame", row.names = c(NA, 
-3L))

答案 1 :(得分:2)

您应该使用|而不是&

library(dplyr)

df1 %>%
  filter(!is.na(KeyPress) | !is.na(KPIndex) | !is.na(X) | !is.na(Y))
#   S.No MediaName KeyPress KPIndex     Type Secs   X  Y
# 1    1       Dat       NA       1 Fixation   18 117 89
# 2    3       Dat       NA       2 Fixation   23 117 NA

答案 2 :(得分:0)

我将以最简单的方式出价。 Dplyr的drop_na将删除所有包含NA的行。

Array.reshape(-1)@Mask.reshape(-1,d)

如果与您的情况有关,则可以指定要查看的列(或不使用“-”)。