Удалите строки с NA в указанные c столбцы и условия - PullRequest
2 голосов
/ 04 февраля 2020
data.frame(id = c(1,2,3,4), stock = c("stock2", NA, NA, NA), bill = c("stock3", "bill2", NA, NA)

Я хотел бы удалить строки, которые имеют в обоих столбцах (запас, счет) пропущенные значения

Пример вывода

data.frame(id = c(1,2), stock = c("stock2", NA), bill = c("stock3", "bill2")

Ответы [ 3 ]

2 голосов
/ 04 февраля 2020

Мы можем использовать rowSums для создания логического вектора в base R

df1[rowSums(is.na(df1[-1])) < ncol(df1)-1,]
#   id  stock   bill
#1  1 stock2 stock3
#2  2   <NA>  bill2

Или используя filter_at из dplyr

library(dplyr)
df1 %>% 
   filter_at(-1,  any_vars(!is.na(.)))
#  id  stock   bill
#1  1 stock2 stock3
#2  2   <NA>  bill2

Мы можем также укажите имена столбцов в пределах vars

df1 %>%
    filter_at(vars(stock, bill), any_vars(!is.na(.)))

ПРИМЕЧАНИЕ. Это также будет работать, если имеется много столбцов для сравнения.

1 голос
/ 04 февраля 2020

Мы можем проверить значения NA в кадре данных и использовать apply для выбора строк, которые имеют хотя бы одно значение, отличное от NA.

df[apply(!is.na(df[-1]), 1, any), ]

#  id  stock   bill
#1  1 stock2 stock3
#2  2   <NA>  bill2

Мы также можем использовать Reduce и lapply с тем же эффектом

df[Reduce(`|`, lapply(df[-1], function(x) !is.na(x))), ]
#OR
#df[Reduce(`|`, lapply(df[-1], complete.cases)), ]
1 голос
/ 04 февраля 2020

Вот два способа использования базы R или dplyr

# the data frame with your values
df <- data.frame(
  id = c(1,2,3,4), 
  stock = c("stock2", NA, NA, NA), 
  bill = c("stock3", "bill2", NA, NA)
)

# base R way
df[!(is.na(df$stock) & is.na(df$bill)), ]

# dplyr way
library(dplyr)

filter(df, !(is.na(stock) & is.na(bill)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...