【问题标题】:Subset a tibble by a smaller tibble用较小的 tibble 子集一个 tibble
【发布时间】:2019-12-07 14:48:26
【问题描述】:

我有两个小玩意

data
A tibble: 6,358,584 x 3
Date     Name       Key
<date>  <chr>      <chr>

treated_group
A tibble: 6,051 x 1  
 Key
 <chr>

该键标识了我处理的组,我想为所有处理的对象子集较大的 tibble。但是通过使用过滤器

data %>% filter(Key == treated_group)

我遇到了错误:

Error in filter_impl(.data, quo) : Result must have length 6358584, not 6051 我认识到我只能对 1x1 使用过滤器,因此我会使用一种解决方法,我循环遍历处理组的行并过滤每一行的数据,但这非常低效,我想留在 dplyr框架。

感谢任何提示和帮助!

head(data)
#> # A tibble: 6 x 3
#>   TIMESTAMP_UTC ENTITY_NAME ENS_KEY                         
#>   <date>        <chr>       <chr>                           
#> 1 2000-01-04    3M Co.      E73F64B685D3E70AFE8DFC37C33825F7
#> 2 2000-01-04    3M Co.      62D1EE4BF4DF6EDD38F95E4033B4E687
#> 3 2000-01-05    3M Co.      24EFCCD1828DDBB164A7CDED15696EC9
#> 4 2000-01-05    3M Co.      62D1EE4BF4DF6EDD38F95E4033B4E687
#> 5 2000-01-10    3M Co.      BF24EB30E19607DD73C0BC51F9EF2DF4
#> 6 2000-01-10    3M Co.      940F168DB3203A028350BC4989EBDE17
head(treated_data)
#> # A tibble: 6 x 1
#>   ENS_KEY                         
#>   <chr>                           
#> 1 2CDDC73CD6247E41244EE82B3BD2AB14
#> 2 940F168DB3203A028350BC4989EBDE17
#> 3 1D9944BA5D170684910D3F5E56C2990B
#> 4 8431C047CFA3920042325B28B238E335
#> 5 606FAF396319C78ABC9CAD17C49E52D9
#> 6 3B277F9151290346EF7E05EC046121D9
filter(data,ENS_KEY %in% treated_data)
#> # A tibble: 0 x 3
#> # ... with 3 variables: TIMESTAMP_UTC <date>, ENTITY_NAME <chr>,
#> #   ENS_KEY <chr>

reprex package (v0.3.0) 于 2019 年 7 月 31 日创建

你可以看到我的数据的条目 6 和我的处理数据的条目 2 匹配,但输出是一个空的 tibble!

【问题讨论】:

  • 改用data %&gt;% filter(Key %in% treated_group)
  • 如果您发现自己需要按一列或多列进行子集化,您可以使用dplyr::semi_join(data, treated_group, by=c('Key', (more columns))
  • 谢谢!!!这很容易解决了我的问题。我觉得很尴尬!
  • 起初我以为它解决了我的问题,但我意识到它给了我一个 0x3 tibble 作为输出。但是,我知道这是不对的,因为通过运行低效的 for 循环,我知道它应该是 3257x3 tibble
  • 也许您可以提供一部分数据,以便我们对其进行测试。使用dput()reprex 或其他内容。

标签: r dplyr


【解决方案1】:

这样的事情怎么样?

pull 函数只获取列中的值并将它们放入向量中。您可以在过滤时将其与 %in% 一起使用。

td <- treated_data %>% 
  pull #just gets the values

data %>% 
  filter(ENS_KEY %in% td)

你会得到:

# A tibble: 1 x 3
  TIMESTAMP_UTC ENTITY_NAME ENS_KEY                         
  <chr>         <chr>       <chr>                           
1 10/01/2000    3M Co.      940F168DB3203A028350BC4989EBDE17

另一个选项,它会给你同样的结果:

data %>% 
  inner_join(treated_data, by = "ENS_KEY")

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2019-05-27
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2018-05-08
    相关资源
    最近更新 更多