【问题标题】:filter tibble of tibbles by nrow按 nrow 过滤 tibble
【发布时间】:2018-01-26 20:56:04
【问题描述】:

我有这样的小玩意

>dat
# A tibble: 556 × 3
           sample      run                   abc
            <chr>    <chr>                <list>
1  206_03_07_2013 21102016   <tibble [304 × 21]>
2  206_04_07_2017  7082017   <tibble [229 × 21]>
3  206_04_10_2015 25112015 <tibble [2,687 × 21]>
4  206_07_08_2013 15102015   <tibble [460 × 21]>
5  206_08_12_2016  3032017 <tibble [3,250 × 21]>
6  206_11_03_2014 21102016   <tibble [975 × 21]>
7  206_13_02_2013 21112016   <tibble [101 × 21]>
8  206_13_03_2013 21112016   <tibble [345 × 21]>
9  206_14_08_2014  8092016 <tibble [1,952 × 21]>
10 206_19_03_2015 25012016    <tibble [11 × 21]>
# ... with 546 more rows

abc 列包含不同长度的小标题。我想使用它们的长度(> 100 行)过滤 dat tibble。

我可以这样做:

dat[sapply(dat$abs,nrow)>100,]

但我想使用 dplyr 哲学? 有什么想法吗?

谢谢

【问题讨论】:

  • 请展示一个使用dput的可重现的小例子

标签: r dplyr tidyverse tibble


【解决方案1】:

一种方法可能是:

library(dplyr)
library(purrr)

dat <- tribble(
  ~foo, ~bar,
  1, as_tibble(head(iris, 3)),
  2, as_tibble(head(iris, 7))
)

# # A tibble: 2 x 2
#     foo              bar
#   <dbl>           <list>
# 1     1 <tibble [3 x 5]>
# 2     2 <tibble [7 x 5]>

res <- filter(dat, map_int(bar, nrow) > 5)

# # A tibble: 1 x 2
#     foo              bar
#   <dbl>           <list>
# 1     2 <tibble [7 x 5]>

desired_output <- dat[sapply(dat$bar,nrow)>5,]
identical(res, desired_output)
# [1] TRUE

这里实际上没有任何附加价值,与您尝试的相比,这是使用直接替换 [sapply 的问题(分别使用 filtermap_int)。 Base R 函数与所谓的“dplyr 哲学”并不矛盾。如果您的意思是使用magrittr 管道%&gt;%dat %&gt;% .[sapply(.$bar, nrow) &gt; 5, ]dat %&gt;% filter(map_int(bar, nrow) &gt; 5) 也同样适用。

注意:我通常更喜欢all.equal 而不是identical,但无法使其工作:

all.equal(res, desired_output)
# Error in equal_data_frame(target, current, ignore_col_order = ignore_col_order,  : 
#   Can't join on 'bar' x 'bar' because of incompatible types (list / list)

(见https://github.com/tidyverse/dplyr/issues/2194

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 2019-03-09
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多