【问题标题】:Dplyr Filtering Based on Year arithmetics基于年份算法的 Dplyr 过滤
【发布时间】:2021-05-28 17:40:09
【问题描述】:

我有一个数据框,它的快照如下所示。

structure(list(cyear = c(1925, 1925, 1925, 1925, 1925, 1926, 1926, 1926, 1926, 1926, 1927, 1927, 1927, 1927, 1927, 1928, 1928, 1928, 1928, 1928), 
holdcyear = c(1925, 1926, 1927, 1928, 1929, 1925, 1926, 1927, 1928, 1929, 1925, 1926, 1927, 1928, 1929, 1925, 1926, 1927, 1928, 1929), 
andiv = c(6.11, 7.19, 8.26, 7.88, 6.58, 5.26, 3.07, 2.87, 3.28, 4.87, 6.87, 5.97, 4.38, 5.74, 5.94, 5.52, 4.53, 5.05, 5.40, 5.51)), 
row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"))

我想过滤数据框。举个例子,我想过滤一个新的数据框,这样我就有了 cyear 等于某个值,holdcyear 等于 cyear + 1 的所有值。最终结果应该如下所示:

structure(list(cyear = c(1925, 1926, 1927, 1928), 
holdcyear = c(1926, 1927, 1928, 1929), 
andiv = c(7.19, 2.87, 5.74, 5.51)), 
row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))

因此,过滤应该在 cyear 比 holdcyear 少一年时进行,andiv 的值将被保存用于新的数据帧。
我曾尝试在 dplyr 的过滤器函数中使用各种算术函数,但每次我都得到错误的数据帧。有人可以为此提供解决方案吗?

【问题讨论】:

    标签: r filter dplyr


    【解决方案1】:
    library(dplyr)
    
    df %>% 
      filter(cyear == holdcyear - 1)
    

    输出

      cyear holdcyear andiv
      <dbl>     <dbl> <dbl>
    1  1925      1926  7.19
    2  1926      1927  2.87
    3  1927      1928  5.74
    4  1928      1929  5.51
    

    【讨论】:

    • 非常感谢。我不确定为什么它适用于 -1,但我没有用我自己的代码尝试过
    • :) ...它可能有效,因为您定义了该条件:“...当 cyear 比 holdcyear 少一年时应该进行过滤...” :==> cyear == holdcyear - 1
    【解决方案2】:

    我们可以在base R中使用subset

    subset(df1, cyear == (holdcyear - 1))
    

    【讨论】:

    • 非常感谢。我不确定为什么它适用于 -1,尽管我现在得到了正确的结果。
    【解决方案3】:

    没有 dplyr。

    df<- structure(list(cyear = c(1925, 1925, 1925, 1925, 1925, 1926, 1926, 1926, 1926, 1926, 1927, 1927, 1927, 1927, 1927, 1928, 1928, 1928, 1928, 1928), 
                   holdcyear = c(1925, 1926, 1927, 1928, 1929, 1925, 1926, 1927, 1928, 1929, 1925, 1926, 1927, 1928, 1929, 1925, 1926, 1927, 1928, 1929), 
                   andiv = c(6.11, 7.19, 8.26, 7.88, 6.58, 5.26, 3.07, 2.87, 3.28, 4.87, 6.87, 5.97, 4.38, 5.74, 5.94, 5.52, 4.53, 5.05, 5.40, 5.51)), 
              row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"))
    
    df[df$holdcyear-df$cyear == 1, ]
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2023-03-14
      • 1970-01-01
      • 2018-09-21
      • 2018-02-19
      相关资源
      最近更新 更多