r - data.frame 中连续年份的子集

标签 r dataframe data.table

我在 R 中有一个 data.frame/data.table 如下:

df <- data.frame(
  ID = c(rep("A", 20)),
  year = c(1968, 1971, 1972, 1973, 1974, 1976, 1978, 1980, 1982, 1984, 1985, 
           1986, 1987, 1988, 1990, 1991, 1992, 1993, 1994, 1995)
)

我想对 df 进行子集化,以便仅保留那些具有 的条目至少连续五年 .在本例中,这是两个时期(1984:1988 和 1990:1995)的情况。我怎样才能在 R 中做到这一点?

最佳答案

使用 diff 的紧凑解决方案和 cumsum :

setDT(df)[, grp := cumsum(c(0, diff(year)) > 1), by = ID
          ][, if (.N > 4) .SD, by = .(ID, grp)][, grp := NULL][]

这给出了所需的结果:
    ID year
 1:  A 1984
 2:  A 1985
 3:  A 1986
 4:  A 1987
 5:  A 1988
 6:  A 1990
 7:  A 1991
 8:  A 1992
 9:  A 1993
10:  A 1994
11:  A 1995

解释:
  • grp := cumsum(c(0, diff(year)) > 1), by = ID您为每个 ID 创建连续年份的(临时)分组变量.
  • if (.N > 4) .SD, by = .(ID, grp)您只为每个 ID 选择连续 5 年或以上的组.
  • grp := NULL您删除(临时)分组变量。


  • 基础 R 中的一种比较方法:
    i <- with(df, ave(year, ID, FUN = function(x) { 
      r <- rle(cumsum(c(0, diff(year)) > 1));
      rep(r$lengths, r$lengths)
      } ))
    
    df[i > 4,] # or df[which(i > 4),]
    

    这会给你同样的结果。

    关于r - data.frame 中连续年份的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40831682/

    相关文章:

    Python 相当于 R 中的 select.list

    r - 使用 R 中的 apply 系列将 2 列数据框的每一行传递给我创建的函数?

    python - For循环根据指定值排除一些DataFrame行

    python - Pandas 数据框 : add & remove prefix/suffix from all cell values of entire dataframe

    r - 使用数据表分组后包含列

    r - 如何将数据表rolling join条件从弱不等式改为严格不等式?

    r - 在数据表中查找数据并将其添加到新列

    r - 如何在 R 中复制带有符号链接(symbolic link)的文件夹/目录?

    r - Kohonen 包 : Error in sample(1:nd, ng,替换 = FALSE)

    r - 如何将堆栈中的栅格图层合并到数据帧 R 中