【问题标题】:Conditional selection two data-frames R条件选择两个数据帧 R
【发布时间】:2020-06-09 13:34:46
【问题描述】:

假设AB 是两个dataframes,那么最快的方法是:

找到A>0andB<0的实例?即A 大于零,条件是B 小于零。

这两个dataframes具有相同的尺寸,非常大(>70GB),并且针对A中的column1B中的coulmn1等完成了操作。

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)

【问题讨论】:

  • 将列提取为向量,然后进行比较i1 <- df1[["A"]] > 0 & df2[["B"]] < 0
  • 您说AB 是数据帧,这有点令人困惑,但在您的示例代码中它们是向量......但我认为很难超越@ 987654339@,或(如果它们是数据帧)A[["column1"]] > 0 & B[["column1]] < 0。如果您使用data.tables 而不是data.frames,可能会快一点。

标签: r dataframe bigdata conditional-statements


【解决方案1】:

这就是你要找的吗?

选项 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

reprex package (v0.3.0) 于 2020 年 2 月 25 日创建

【讨论】:

  • 先过滤 A 和 B 条件,然后加入较小的数据帧(假设根本需要连接)会更有效。
  • 谢谢!我只是在我的答案中添加了另外两个选项。
  • 您确实在假设有一个 ID 列...根据经验,我会避免根据如此强大的假设在答案上做太多的工作
  • 我假设有一个 ID 列或类似的东西,因为问题明确指出 A 和 B 是 两个数据帧 - 尽管它们似乎是向量。
  • 是的,但它也声明它们具有“相等的尺寸”,这可能意味着在没有 id 的情况下按位置操作,这(如果可能的话)会比任何加入。
猜你喜欢
  • 2015-03-16
  • 2018-03-27
  • 2019-01-07
  • 1970-01-01
  • 2014-11-18
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多