我在 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/