【问题标题】:apply lag or lead in increasing order for the dataframe以递增顺序为数据帧应用滞后或领先
【发布时间】:2018-12-26 05:25:45
【问题描述】:
df1 <- read.csv("C:/Users/uni/DS-project/df1.csv")
df1

    year value
1  2000     1
2  2001     2
3  2002     3
4  2003     4
5  2004     5
6  2000     1
7  2001     2
8  2002     3
9  2003     4
10 2004     5
11 2000     1
12 2001     2
13 2002     3
14 2003     4
15 2004     5
16 2000     1
17 2001     2
18 2002     3
19 2003     4
20 2004     5

我想申请铅,所以我可以得到以下方式的输出。

我们设置了每年重复 n 次的 5 个观察值,在第一年的输出中,我们需要删除 2000 及其各自的值,第二年类似,我们忽略 2000 和 2001 及其各自的值,对于第 3 年删除 - 2000、2001、2002 及其各自的值。等等。

以便我们可以通过以下方式获得以下输出。

output: 
year    value
2000    1
2001    2
2002    3
2003    4
2004    5
2001    2
2002    3
2003    4
2004    5
2002    3
2003    4
2004    5
2003    4
2004    5

请帮忙。

【问题讨论】:

  • 到目前为止你尝试过什么?愿意分享任何代码吗?

标签: r dataframe lag lead


【解决方案1】:

只是为了好玩,使用矩阵子设置添加矢量化解决方案

m <- matrix(rep(TRUE, nrow(df)), 5)
m[upper.tri(m)] <- FALSE
df[m,]
#    year value
# 1  2000     1
# 2  2001     2
# 3  2002     3
# 4  2003     4
# 5  2004     5
# 7  2001     2
# 8  2002     3
# 9  2003     4
# 10 2004     5
# 13 2002     3
# 14 2003     4
# 15 2004     5
# 19 2003     4
# 20 2004     5

【讨论】:

    【解决方案2】:

    grp 下方是第一组的每一行 1,第二组的每一行是 2,依此类推。 Seq 是 1, 2, 3, ... 对于每个 grp 的连续行。现在只需选择那些Seq 至少与grp 一样大的行。这具有从 i = 1, 2, ... 的第 i 个组中删除前 i-1 行的效果。

    grp <- cumsum(df1$year == 2000)
    Seq <- ave(grp, grp, FUN = seq_along)
    subset(df1, Seq >= grp)
    

    我们可以交替写成不太一般的形式:

    subset(df1, 1:5 >= rep(1:4, each = 5))
    

    在任何情况下,任何一个子集语句的输出都是:

       year value
    1  2000     1
    2  2001     2
    3  2002     3
    4  2003     4
    5  2004     5
    7  2001     2
    8  2002     3
    9  2003     4
    10 2004     5
    13 2002     3
    14 2003     4
    15 2004     5
    19 2003     4
    20 2004     5
    

    【讨论】:

      【解决方案3】:
      library(dplyr)
      
      df %>% 
        group_by(g = cumsum(year == 2000)) %>% 
        filter(row_number() >= g) %>% 
        ungroup %>% 
        select(-g)
      
      
      # # A tibble: 14 x 2
      #     year value
      #    <int> <int>
      #  1  2000     1
      #  2  2001     2
      #  3  2002     3
      #  4  2003     4
      #  5  2004     5
      #  6  2001     2
      #  7  2002     3
      #  8  2003     4
      #  9  2004     5
      # 10  2002     3
      # 11  2003     4
      # 12  2004     5
      # 13  2003     4
      # 14  2004     5
      

      【讨论】:

        【解决方案4】:

        使用lapply():

        to <- nrow(df) / 5 - 1
        df[-unlist(lapply(1:to, function(x) seq(1:x) + 5*x)), ]
           year value
        1  2000     1
        2  2001     2
        3  2002     3
        4  2003     4
        5  2004     5
        7  2001     2
        8  2002     3
        9  2003     4
        10 2004     5
        13 2002     3
        14 2003     4
        15 2004     5
        19 2003     4
        20 2004     5
        

        unlist(lapply(1:to, function(x) seq(1:x) + 5*x)) 是要跳过的索引:

        [1]  6 11 12 16 17 18
        

        【讨论】:

          【解决方案5】:

          使用sequence

          df[5-rev(sequence(2:5)-1),]
          #     year value
          # 1   2000     1
          # 2   2001     2
          # 3   2002     3
          # 4   2003     4
          # 5   2004     5
          # 2.1 2001     2
          # 3.1 2002     3
          # 4.1 2003     4
          # 5.1 2004     5
          # 3.2 2002     3
          # 4.2 2003     4
          # 5.2 2004     5
          # 4.3 2003     4
          # 5.3 2004     5
          

          它是如何工作的:

          5-rev(sequence(2:5)-1)
          # [1] 1 2 3 4 5 2 3 4 5 3 4 5 4 5
          rev(sequence(2:5)-1)
          # [1] 4 3 2 1 0 3 2 1 0 2 1 0 1 0
          sequence(2:5)-1
          # [1] 0 1 0 1 2 0 1 2 3 0 1 2 3 4
          sequence(2:5)
          # [1] 1 2 1 2 3 1 2 3 4 1 2 3 4 5
          

          【讨论】:

            猜你喜欢
            • 2018-09-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            • 2020-04-20
            相关资源
            最近更新 更多