r - r data.table 根据条件选择行
问题描述
我有一个这样的data.table
library(data.table)
cells <- c(100, 1, 1980, 1, 0, 1,1,0,1, 150, 1 , 1980, 1,1,1,0,0,0,99,1,1980,1,1,1,1,0,0,899,1,1980,0,1,0,1,1,1 )
colname <- c("number","sex", "birthy", "2004","2005", "2006", "2007", "2008", "2009")
rowname <- c("1","2","3","4")
y <- matrix(cells, nrow=4, ncol=9, byrow=TRUE, dimnames = list(rowname,colname))
y <- data.table(y, keep.rownames = TRUE)
2004 列中的值 1 表示此人在 2004 年连续投保。前 3 年投保的人员可以参与研究。我需要这个 data.table 的一个子集,其中包含以下条件为真的所有观察结果:2004+2005+2006 = 3 或 2005+2006+2007 = 或 2006+2007+...
为了解决这个问题,我编写了一个函数,并想用 lappy 应用这个函数,遍历所有年份,直到最后一个可能的序列。实际上开始年份和结束年份以及序列的最小长度可能会有所不同
years <- function(year, DTbl) {
DTbl[sum(year:as.numeric(year+2))==3,]
}
by <- 2004 # study start
ey <- 2009 # study end
len <- 2007 # maximal begin of sequence to be tested
jahre <-3
DTpy <- data.table::rbindlist(lapply(by:len, years, DTbl=y))
显然这不起作用,但也是这个
test <- y[ y[, 2006==1], vnew := "ok"]
从来都不是真的。
在花了很多时间在这里寻找一些答案之后,我决定发布这个问题。我仍在学习 R,感谢您在此问题上的意见。
谢谢阿丽娜
解决方案
我建议将数据从宽格式转换为长格式。在长格式中,该rle()
函数可用于识别 3 个或更多后续年份的序列:
tmp <- melt(y, id = "rn", measure.vars = patterns("^20"),
variable.factor = FALSE, variable.name = "year")[
, rle(value), by = rn][values == 1, which(max(lengths) >= 3), by = rn]$rn
tmp
[1] "2" "3" "4"
这些是满足条件的行 ID。这些可用于子集y
:
y[as.integer(tmp)]
rn number sex birthy 2004 2005 2006 2007 2008 2009 1: 2 150 1 1980 1 1 1 0 0 0 2: 3 99 1 1980 1 1 1 1 0 0 3: 4 899 1 1980 0 1 0 1 1 1
推荐阅读
- python - 使用从 python 中的命令行输入动态获取的名称创建实例
- mongodb - 二进制数据中的Spring Mongodb搜索字符串
- mysql - IN 运算符 mysql
- html - 如何在新行中添加最后一个标签?
- python - Python:如何检查嵌套结构中的键是否存在?
- node.js - 当文档长度超过 50k 时,MongoDB insetMany 不插入所有文档
- colors - Anychart 网格交替颜色
- next.js - 如何在 NEXT.JS 中设置 react-redux-firestore
- python - PySpark 使用不同技术进行过滤时的性能差异
- javascript - 我可以将返回字符串的 if else 语句连接到服务器端呈现的 HTML 元素吗?