Як об'єднати кілька умов для підмноження кадру даних за допомогою “АБО”?


174

У мене є data.frame в R. Я хочу спробувати дві різні умови на двох різних стовпцях, але я хочу, щоб ці умови були включними. Тому я хотів би використовувати "АБО", щоб поєднати умови. Я раніше користувався наступним синтаксисом з великим успіхом, коли хотів використати умову "І".

my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ]

Але я не знаю, як використовувати "АБО" у вищесказаному.

Відповіді:


249
my.data.frame <- subset(data , V1 > 2 | V2 < 4)

Альтернативне рішення, яке імітує поведінку цієї функції та було б більш доцільним для включення в функціональний орган:

new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]

Деякі люди критикують використання whichяк не потрібне, але це заважає NAцінностям відкидати небажані результати. Еквівалент (. Не повертає NA-рядки для будь-яких NA в V1 або V2) двом варіантам, продемонстрованим вище без whichзначень, буде:

 new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4)  , ]

Примітка. Я хочу подякувати анонімному дописувачу, який намагався виправити помилку в коді безпосередньо вище, виправлення, яке було відхилено модераторами. Насправді була додаткова помилка, яку я помітив, коли виправляв першу. Умовне застереження, яке перевіряє значення NA, має бути першим, якщо воно обробляється так, як я задумав, оскільки ...

> NA & 1
[1] NA
> 0 & NA
[1] FALSE

Порядок аргументів може мати значення при використанні "&".


1
Це найвищий голосував питання , а потім один знахідки: stackoverflow.com/questions/9860090 / ...
PatrickT

1
Перевага - компактність та легкість у розумінні. Недоліком є ​​відсутність корисності в завданнях побудови функцій. Якщо ви хочете повторити це, [потрібно загорнути whichабо використати додаткові !is.naобмеження.
IRTFM

Чи потрібне "яке" і якщо ні, то для чого ви його використовуєте?
Клеб

1
Це не "потрібно", але ви можете отримати інший результат, якщо залишите його which. Якщо і V1, і V2 - NA, ви отримаєте рядок NA у такому положенні, якщо ви не залишили which. Я працюю з великими наборами даних, і навіть порівняно невеликий відсоток НС справді заповнить мій екран непотрібними результатами. Деякі люди вважають, що це особливість. Я не.
IRTFM

як ви включаєте виклик до цього greplчи grepразом із цим, щоб виконати відповідність шаблонів для бажаних рядків, крім цих умов?
користувач5359531

31

Ви шукаєте "|". Дивіться http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors

my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]

Це НЕ є надійним для існування NAs у фреймі даних:vc <- data.frame(duzey=factor(c("Y","O","Y","D","Y","Y","O"), levels=c("D","O","Y"), ordered=TRUE), cinsiyet=c("E","E","K",NA,"K","E","K"), yas=c(8,3,9,NA,7,NA,6), Not=c(NA,1,1,NA,NA,2,1)); vc; vc[vc$cinsiyet == "E" | vc$Not < 4,]; vc[vc$cinsiyet == "E" & vc$Not < 2,]
Ердоган ЦЕВЕР

17

Тільки задля повноти ми можемо використовувати оператори [та [[:

set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])

Кілька варіантів

df[df[1] < 0.5 | df[2] == "g", ] 
df[df[[1]] < 0.5 | df[[2]] == "g", ] 
df[df["v1"] < 0.5 | df["v2"] == "g", ]

df $ name еквівалентно df [["name", точне = FALSE]]

Використання dplyr:

library(dplyr)
filter(df, v1 < 0.5 | v2 == "g")

Використання sqldf:

library(sqldf)
sqldf('SELECT *
      FROM df 
      WHERE v1 < 0.5 OR v2 = "g"')

Вихід для вищезазначених варіантів:

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j

1
як би ви зробили це для умови 1 AND та 3 АБО умовних умов, наприклад: my.data.frame <- дані [дані $ V3> 10 & ((дані $ V1> 2) | (дані $ V2 <4) | (дані $ V4 <5),]. Коли я це роблю, це не працює
R Гуру,

1
Оце Так! sqldfПакет занадто добре. Дуже зручно, особливо коли subset()стає боляче :)
Dawny33
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.