簡體   English   中英

R通過多個條件與兩個數據幀進行比較以提取行

[英]R compare with two dataframes by multiple conditions to extract rows

我有兩個數據框:

 x <- data.frame('a'=c(1,1,2,2,3,3),'b'=c(1,2,1,2,1,2),'c'=c(1,2,3,2,1,3))

    y <- data.frame('a'=c(1,2,3),'b'=c(1,1,1),'c'=c(1,2,3))

想從 x 中提取行,條件如下:

 x$a==y$a & x$b==y$b+1 & (if y$c == 1, then x$c %in% c(2,3); if ...)

結果應該是: x: abc 1 2 2 只有 x 匹配中的第 2 行。 我試過了:

 z <- y[which(y$a == x$a & y$b == x$b+1),] 

至少匹配前兩個條件,但不起作用,結果為空。 什么是合適的處理方式? 請幫忙。

也許,您可以嘗試在sqldf幫助下運行 SQL 語句:

sqldf("select x.* from x join y where 
      x.a = y.a and 
      x.b = y.b + 1 and
      y.c = 1 and
      x.c in (2, 3)")
 abc 1 1 2 2

這將返回給定樣本數據集的預期結果。 但是,它需要使用生產數據集進行測試。

第三個和第四個條件是“固定的”,例如, y$c == 1x$c %in% c(2, 3) 因此,可以加入之前過濾xy

sqldf("select u.* from 
      (select * from x where c in (2, 3)) as u
      join 
      (select * from y where c = 1) as v
      where u.a = v.a")
 abc 1 1 2 2

也許,這可能會導致性能提升(未經測試!)

這種方法也可以用於dplyr

library(dplyr)
x %>% 
  filter(c %in% 2:3) %>% 
  inner_join(
    y %>% 
      filter(c == 1) %>% 
      mutate(bp1 = b + 1), 
    by = c("a", "b" = "bp1"))
 ab cx by cy 1 1 2 2 1 1

我不知道這里應該進行簡單的“合並”(由於不等式),但這里有一個嘗試:

library(dplyr)
y %>%
  mutate(bp1 = b + 1) %>%
  inner_join(x, ., by = c("a", "b" = "bp1")) %>%
  filter(c.y == 1 & c.x %in% c(2, 3))
#   a b c.x b.y c.y
# 1 1 2   2   1   1

注意: .x.y巧合地與它們來自的幀相同,但這只是巧合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM