簡體   English   中英

在 R 中使用 diff 和 cumsum

[英]using diff and cumsum in R

我一直在嘗試使用這個問題中提供的解決方案,但是由於某種原因它不起作用。

基本上,我想找到至少連續4 年的所有 ID,並且只保留屬於這些 ID 的行。

有任何想法嗎?

# example data
ID <- c(rep("A", 5), rep("B", 6), rep("C", 2), rep("D", 3), rep("E", 4))
year <- as.numeric(c(rep(c(2012, 2013, 2014, 2015), 4), 2012, 2013, 2015, 2016))
mydata <- cbind(ID, year)
mydata <- as.data.table(mydata)
mydata$year <- as.numeric(mydata$year)

# provided solution
mydata2 <- setDT(mydata)[, grp := cumsum(c(0, diff(year)) > 1), by = ID
                         ][, if (.N > 4) .SD, by = grp][, grp := NULL][]

這是使用data.table做到這一點的方法。 基本上,您要確保首先對表格進行排序。 其次,我使用的是diff(year)==1 我們想要連續的年份,所以重要的是diff恰好等於 1 以防止年份跳躍。 最后,我只保留 max(cumsum) 為 3 或更多的 ID(3 而不是 4,因為我們從 0 開始計數)。

setorder(mydata)
mydata2 <- mydata[, grp := cumsum(c(0, diff(year)==1)), by = ID]
mydata2[,max_grp := max(grp), by=ID]
mydata2[max_grp>=3]

    ID year grp max_grp
 1:  A 2012   0       3
 2:  A 2012   0       3
 3:  A 2013   1       3
 4:  A 2014   2       3
 5:  A 2015   3       3
 6:  B 2012   0       3
 7:  B 2013   1       3
 8:  B 2013   1       3
 9:  B 2014   2       3
10:  B 2014   2       3
11:  B 2015   3       3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM