ตัวแปรเด็ดขาด V1 ในกรอบข้อมูล D1 สามารถมีค่าที่แสดงด้วยตัวอักษรจาก A ถึง Z ฉันต้องการสร้าง D2 ชุดย่อยซึ่งไม่รวมค่าบางค่าเช่น B, N และ T โดยทั่วไปฉันต้องการคำสั่งที่เป็น ตรงกันข้ามกับ %in%
D2 = subset(D1, V1 %in% c('B','N',T'))
ตัวแปรเด็ดขาด V1 ในกรอบข้อมูล D1 สามารถมีค่าที่แสดงด้วยตัวอักษรจาก A ถึง Z ฉันต้องการสร้าง D2 ชุดย่อยซึ่งไม่รวมค่าบางค่าเช่น B, N และ T โดยทั่วไปฉันต้องการคำสั่งที่เป็น ตรงกันข้ามกับ %in%
D2 = subset(D1, V1 %in% c('B','N',T'))
คำตอบ:
คุณสามารถใช้!
โอเปอเรเตอร์เพื่อสร้าง TRUE FALSE และ FALSE TRUE ดังนั้น:
D2 = subset(D1, !(V1 %in% c('B','N','T')))
แก้ไข: คุณสามารถสร้างโอเปอเรเตอร์ได้ด้วยตนเอง:
'%!in%' <- function(x,y)!('%in%'(x,y))
c(1,3,11)%!in%1:10
[1] FALSE FALSE TRUE
?"%in%"
) %w/o%
ในกรณีที่ผู้ประกอบการใหม่ที่เรียกว่า
?Negate
เช่น"%ni%" <- Negate("%in%")
subset(df, variable %ni% c("A", "B"))
แต่ไม่ใช่เมื่อใช้โดยตรงเช่นsubset(df, variable Negate("%in%") c("A", "B"))
%
และผู้ประกอบการในตัวหรือเริ่มต้นและจบลงด้วยการ %
เพื่อสร้างผู้ประกอบการคุณต้องกำหนดฟังก์ชั่นที่มีสองตัวถูกดำเนินการให้เป็นชื่อที่ขึ้นต้นและลงท้ายด้วย
เกี่ยวกับ:
'%ni%' <- Negate('%in%')
c(1,3,11) %ni% 1:10
# [1] FALSE FALSE TRUE
ถ้าคุณดูรหัส %in%
function (x, table) match(x, table, nomatch = 0L) > 0L
จากนั้นคุณควรจะสามารถเขียนเวอร์ชันตรงข้ามของคุณ ฉันใช้
`%not in%` <- function (x, table) is.na(match(x, table, nomatch=NA_integer_))
อีกวิธีคือ:
function (x, table) match(x, table, nomatch = 0L) == 0L
นี่คือรุ่นที่ใช้filter
ในdplyr
ที่ใช้เทคนิคเดียวกับคำตอบที่ยอมรับโดยการปฏิเสธตรรกะด้วย!:
D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T'))
การใช้negate
จากpurrr
เคล็ดลับก็ทำได้อย่างรวดเร็วและเป็นระเบียบ:
`%not_in%` <- purrr::negate(`%in%`)
ตัวอย่างเช่นการใช้งานคือ
c("cat", "dog") %not_in% c("dog", "mouse")
Negate
ที่ทำเช่นเดียวกัน แตกต่างเพียงว่าสาย purrr as_mapper
ในสิ่งที่คุณผ่านในขณะที่โทรNegate
rdocumentation.org/packages/purrr/versions/0.2.5/topics/… stat.ethz.ch/R-manual/R-devel/library/base/html/match.fun.htmlmatch.fun
purrr::compose()
เป็นอีกวิธีที่รวดเร็วในการกำหนดสิ่งนี้เพื่อใช้ในภายหลังเช่นเดียวกับใน:
`%!in%` <- compose(`!`, `%in%`)
วิธีแก้ปัญหาอื่นอาจใช้ setdiff
D1 = c("A",..., "Z") ; D0 = c("B","N","T")
D2 = setdiff(D1, D0)
D2
เป็นชุดย่อยที่คุณต้องการ
Hmisc มี%nin%
ฟังก์ชันซึ่งควรทำสิ่งนี้
https://www.rdocumentation.org/packages/Hmisc/versions/4.4-0/topics/%25nin%25
ฉันคิดว่าการใช้งานที่ชัดเจนเป็นเพียงแค่
!('Spain' %in% c('Germany', 'France', 'Italy'))
library(roperators)
1 %ni% 2:10
require(TSDT)
c(1,3,11) %nin% 1:10
# [1] FALSE FALSE TRUE
สำหรับข้อมูลเพิ่มเติมคุณสามารถดู: https://cran.r-project.org/web/packages/TSDT/TSDT.pdf
ความช่วยเหลือสำหรับ% in%, help("%in%")
รวมถึงในส่วนตัวอย่างคำนิยามนี้ไม่รวมอยู่ใน
"%w/o%" <- function(x, y) x[!x %in% y] #-- x without y
มาลองดูกัน:
c(2,3,4) %w/o% c(2,8,9)
[1] 3 4
อีกทางเลือกหนึ่ง
"%w/o%" <- function(x, y) !x %in% y #-- x without y
c(2,3,4) %w/o% c(2,8,9)
# [1] FALSE TRUE TRUE
!(x %in% y)
) บางครั้งชีวิตอาจเป็นเรื่องง่าย ...