【问题标题】:r data.table selecting rows on conditionr data.table 根据条件选择行
【发布时间】:2019-01-15 14:02:04
【问题描述】:

我有一个这样的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,感谢您在此问题上的意见。

谢谢 阿丽娜

【问题讨论】:

  • 仅供参考,因为2006也可以读作数字,所以可以用反引号表示列,y[`2006`==1]
  • 好的,所以 backsticks 用于不同的变量名称,也可以读取为数字。谢谢弗兰克。

标签: r data.table conditional-statements subset lapply


【解决方案1】:

我建议将数据从宽格式转换为长格式。在长格式中,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

【讨论】:

  • @Frank,你是对的,as.integer(year) 是另一种涉及diff(year) 的方法的人工制品
  • 非常感谢你们,太好了!
  • 此解决方案运行顺畅。现在,如果它们不属于后续组,我需要将所有 1 转换为 0。例如rn==4,变量“2005”需要设置为零。有什么建议吗?
  • @AlinaLudewig。我认为会有一个基于rle(value) 的解决方案。但是,这是一个不同的问题,所以请发布一个新问题。
猜你喜欢
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2021-09-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多