Условный выбор двух фреймов данных R - PullRequest
1 голос
/ 25 февраля 2020

Предположим, что A и B - это два dataframes, что будет самым быстрым способом:

найти случаи, где A>0 and B<0? то есть A больше нуля при условии, что B меньше нуля.

Два dataframes имеют одинаковые размеры, очень большие (>70GB), и операция выполняется для column1 в A против coulmn1 в B и др. c ..

A=c(-31.621, -40.149, -21.519, -33.773, -34.023, -38.345, -39.238, 
    -30.221, -22.278, 27.055)

B=c(-29.321, -26.398, -25.663, -26.423, -23.721, -17.418, -15.979, 
    -21.927, -16.398, -21.084)

1 Ответ

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

Это то, что вы ищете?

ВАРИАНТ 1 - Условия объединения и обработки

library(tibble)
library(dplyr)

A <- c(-31.621, -40.149, -21.519, -33.773, -34.023, -38.345, -39.238, 
       -30.221, -22.278, 27.055) %>% 
  enframe(name = "ID")

B <- c(-29.321, -26.398, -25.663, -26.423, -23.721, -17.418, -15.979, 
       -21.927, -16.398, -21.084) %>% 
  enframe(name = "ID")

A %>% 
  left_join(., B, by = "ID", suffix = c("_A", "_B")) %>% 
  mutate(condition = case_when(value_A > 0 & value_B < 0 ~ T,
                               TRUE ~ F))

#> # A tibble: 10 x 4
#>       ID value_A value_B condition
#>    <int>   <dbl>   <dbl> <lgl>    
#>  1     1   -31.6   -29.3 FALSE    
#>  2     2   -40.1   -26.4 FALSE    
#>  3     3   -21.5   -25.7 FALSE    
#>  4     4   -33.8   -26.4 FALSE    
#>  5     5   -34.0   -23.7 FALSE    
#>  6     6   -38.3   -17.4 FALSE    
#>  7     7   -39.2   -16.0 FALSE    
#>  8     8   -30.2   -21.9 FALSE    
#>  9     9   -22.3   -16.4 FALSE    
#> 10    10    27.1   -21.1 TRUE

ВАРИАНТ 2 - Условия обработки и затем присоединение

library(tibble)
library(dplyr)

A <- c(-31.621, -40.149, -21.519, -33.773, -34.023, -38.345, -39.238, 
       -30.221, -22.278, 27.055) %>% 
  enframe(name = "ID") %>% 
  filter(value > 0)

B <- c(-29.321, -26.398, -25.663, -26.423, -23.721, -17.418, -15.979, 
       -21.927, -16.398, -21.084) %>% 
  enframe(name = "ID") %>% 
  filter(value < 0)

A %>% 
  left_join(., B, by = "ID", suffix = c("_A", "_B"))

#> # A tibble: 1 x 3
#>      ID value_A value_B
#>   <int>   <dbl>   <dbl>
#> 1    10    27.1   -21.1

ВАРИАНТ 3 - Условия обработки и поиск индекса, соответствующего условию

library(tibble)
library(dplyr)

A <- c(-31.621, -40.149, -21.519, -33.773, -34.023, -38.345, -39.238, 
       -30.221, -22.278, 27.055) %>% 
  enframe(name = "ID") %>% 
  filter(value > 0)

B <- c(-29.321, -26.398, -25.663, -26.423, -23.721, -17.418, -15.979, 
       -21.927, -16.398, -21.084) %>% 
  enframe(name = "ID") %>% 
  filter(value < 0)

intersect(A$ID, B$ID)
#> [1] 10

Создано в 2020-02-25 представителем пакета (v0.3.0)

...