удалить строки из кадра данных на основе значения, игнорируя NA

Мы можем объединить две коллекции, используя sub-запрос mongoDB. Вот пример, Комментарии -

`db.commentss.insert([
  { uid:12345, pid:444, comment:"blah" },
  { uid:12345, pid:888, comment:"asdf" },
  { uid:99999, pid:444, comment:"qwer" }])`

Пользователи -

db.userss.insert([
  { uid:12345, name:"john" },
  { uid:99999, name:"mia"  }])

Суб-запрос MongoDB для JOIN -

`db.commentss.find().forEach(
    function (newComments) {
        newComments.userss = db.userss.find( { "uid": newComments.uid } ).toArray();
        db.newCommentUsers.insert(newComments);
    }
);`

Получить результат из недавно созданная коллекция -

db.newCommentUsers.find().pretty()

Результат -

`{
    "_id" : ObjectId("5511236e29709afa03f226ef"),
    "uid" : 12345,
    "pid" : 444,
    "comment" : "blah",
    "userss" : [
        {
            "_id" : ObjectId("5511238129709afa03f226f2"),
            "uid" : 12345,
            "name" : "john"
        }
    ]
}
{
    "_id" : ObjectId("5511236e29709afa03f226f0"),
    "uid" : 12345,
    "pid" : 888,
    "comment" : "asdf",
    "userss" : [
        {
            "_id" : ObjectId("5511238129709afa03f226f2"),
            "uid" : 12345,
            "name" : "john"
        }
    ]
}
{
    "_id" : ObjectId("5511236e29709afa03f226f1"),
    "uid" : 99999,
    "pid" : 444,
    "comment" : "qwer",
    "userss" : [
        {
            "_id" : ObjectId("5511238129709afa03f226f3"),
            "uid" : 99999,
            "name" : "mia"
        }
    ]
}`

Надеюсь, что это поможет.

0
задан Sotos 17 January 2019 в 15:00
поделиться

2 ответа

Нам нужно выбрать строки, где d не больше 0 ИЛИ NA есть в d

df[with(df, !d > 0 | is.na(d)), ]

#   a  b c  d
#1  1  2 3  0
#2  4 NA 1 NA
#4 NA  5 0  0

Или мы также можем использовать subset

[111 ]

или dplyr filter

library(dplyr)
df %>% filter(!d > 0 | is.na(d))

Часть !d > 0 также можно повернуть на

subset(df, d < 1 | is.na(d))

, чтобы получить тот же результат. [1115 ]

0
ответ дан Ronak Shah 17 January 2019 в 15:00
поделиться

Мы можем построить логический вектор с complete.cases

subset(df, !d > 0 | complete.cases(d))
#   a b c d
#1  1 2 3 0
#3  6 4 0 1
#4 NA 5 0 0

Или использовать subset с replace

subset(df,  !replace(d, is.na(d), 0) > 0)

Или с tidyverse [1113 ]

library(tidyverse)
df %>%
   filter(!replace_na(d, 0) >0)

, что немного отличается от метода, упомянутого здесь или здесь

данных

df <- structure(list(a = c(1L, 4L, 6L, NA), b = c(2L, NA, 4L, 5L), 
c = c(3L, 1L, 0L, 0L), d = c(0L, NA, 1L, 0L)), class = "data.frame",
 row.names = c("1", "2", "3", "4"))
0
ответ дан akrun 17 January 2019 в 15:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: