【问题标题】:find intersection among days寻找天之间的交点
【发布时间】:2019-09-09 17:16:52
【问题描述】:

我有一个数据框,其中一列包含代码编号,另一列包含日期。我正在尝试使用 dplyr 和 intersect 来查找天之间的共同元素。

样本数据:

df <- data.frame(A=c(2289,490,3940,1745,855,3954,2289,555,3940,667,855,3954,2289,490,12,1745,3000,3954,2289,490,3940,28,855,3954),B=as.Date(c("2019-08-01","2019-08-01","2019-08-01","2019-08-01","2019-08-01","2019-08-01","2019-08-02","2019-08-02","2019-08-02","2019-08-02","2019-08-02","2019-08-02","2019-08-03","2019-08-03","2019-08-03","2019-08-03","2019-08-03","2019-08-03","2019-08-04","2019-08-04","2019-08-04","2019-08-04","2019-08-04","2019-08-04")))

我正在尝试这样的事情:

df %>% group_by(B) %>% intersect(A)

预期输出是每天常见的代码。例如 2289 是期望值,但 28 不是。

我想知道在这种情况下我是否可以使用 intersect。

感谢任何帮助

问候

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是一种方法-

    df %>% 
      # filter(!duplicated(.)) %>% # add this if there can be duplicates
      count(A) %>% 
      filter(n == n_distinct(df$B))
    
    # A tibble: 2 x 2
          A     n
      <dbl> <int>
    1  2289     4
    2  3954     4
    

    如果您更喜欢intersect,则可以使用基本 R 解决方案,尽管我猜如果组数较多,上述方法会更快 -

    Reduce(intersect, split(df$A, df$B))
    
    [1] 2289 3954
    

    【讨论】:

    • 为什么不放弃df$
    • @camille Bcount(A) 之后被删除。
    • 哦,对了。所以你不能用group_by + mutate 代替count 吗?这样你就不会丢失另一列
    • @camille 我想到了,但我发现上面的代码更简洁,我认为使用df$B 没有任何问题,是吗?
    • 在这种情况下,我想不会。在更复杂的情况下,您从管道中更高的位置检查n_distinct,您可能会遇到麻烦。它很突出,因为它不遵循正常的 tidyeval 语法,所以我主要是好奇你为什么这样接近它
    【解决方案2】:

    作为旁注 - 你可以在base R:

    sort(unique(df$A))[rowMeans(table(df)) == 1]
    
    #2289 3954
    

    【讨论】:

      【解决方案3】:

      你也可以试试:

      df %&gt;% group_by(A) %&gt;% summarize(if_all = length(intersect(B, unique(df$B))) == length(unique(df$B)))

      使用intersect

      【讨论】:

        猜你喜欢
        • 2015-02-28
        • 1970-01-01
        • 2014-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多