抱歉标题不明确。这是感兴趣的data.table:
dt <- data.table(K=c("A","A","A","B","B","B"),Y=c("2010","2010","2011","2011","2011","2010"),Q1=c(2,3,4,1,3,4),Q2=c(3,3,3,1,1,1))
dt
K Y Q1 Q2
1: A 2010 2 3
2: A 2010 3 3
3: A 2011 4 3
4: B 2011 1 1
5: B 2011 3 1
6: B 2010 4 1
假设 K 的值是人,所以这里有两个。一年中的季度存储在 Q1 和 Q2 中。Q2 是一种参考季度变量,其值始终与 2011 年相关)。现在我想在 dt 中选择那些行,其中,对于 K 中的每个人,Q1 位于 Q2 值之前的 4 个季度的区间内。
示例:
人员 A 在 Q2 的值为 3,因此应选择值 2 (2011)、1(2011)、4(2010) 和 3 (2010)。考虑到这个数据集,这只是第 2 行。第 3 行中的值 Q1=4 太大,第 1 行中的值 Q1=2 太小。对于第二个人“B”,将只选择第 6 行。不是第 4 行,因为这是与 Q2 相同的季度(我只想要那些小于 Q2 的值,而第 5 行显然大于 Q2 的值。
dt_new
K Y Q1 Q2
1: A 2010 3 3
2: B 2010 4 1
总结一下:
Q2 中的值 4 意味着:选择 Q1 中小于 4 的所有值,其中 Y=2011,并选择 Q1 中的所有值等于或大于 4(所以只有 4),其中 Y=2010。结果:3(2011)、2(2011)、1(2011)、4(2010)。此规则适用于 Q2 的所有值。所有这些都应该为每个人完成。
我希望我的问题得到解决。我认为有很多方法可以解决这个问题,但是由于我还在学习 data.table,所以我想请你提供一些好的和优雅的解决方案(希望有)。
谢谢
编辑:
几乎找到了解决方案:这给了我一个逻辑向量。如何提取数据集中的行?
setkey(dt,K)
dt[,(Q1<Q2 & Y=="2011")|(Q1>=Q2 & Y=="2010"),by="K"]
K V1
1: A FALSE
2: A TRUE
3: A FALSE
4: B FALSE
5: B FALSE
6: B TRUE
不这样做:
log <-dt[,(Q1<Q2 & Y=="2011")|(Q1>=Q2 & Y=="2010"),by="K"]$V1
dt[log]