R 数据准备方面的问题

R 数据准备方面的问题,r,data.table,R,Data.table,对不起,标题不具体。以下是感兴趣的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

对不起,标题不具体。以下是感兴趣的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
总而言之:
假设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
setkey(dt,K)
dt[,(Q1=Q2&Y==“2010”),由=“K”]
kv1
1:假
2:真的吗
3:一个错误
4:B错
5:B错
6:B是的
如果不这样做:

log <-dt[,(Q1<Q2 & Y=="2011")|(Q1>=Q2 & Y=="2010"),by="K"]$V1
dt[log]

log这是一个常规的行过滤,因此您不需要(或不应该)使用分组(
by=“K”
),只需执行以下操作:

dt[(Q1 < Q2 & Y == "2011") | (Q1 >= Q2 & Y == "2010"), ]
这不仅是更一般的,它读起来更好,并使参考年是2011年的假设明确

请注意,我是如何小心地在
quarter.diff
函数中将所有列转换为整数的。理想情况下,您的年度和季度数据已经存储为整数,而不是字符或数字

最后,如果您担心调用两次
quarter.diff
,并且担心速度问题,您可以将结果临时存储为注释中建议的@Arun:

dt[{qdiff <- quarter.diff(Q1, Y, Q2, Y2 = "2011")
    qdiff > 0L & qdiff <= 4L}, ]

dt[{qdiff 0L&qdiff您可以通过将结果赋给一个变量来减少对
quarter.diff的双重调用,比如说
w
,然后执行:
,其中(w>0L&w是一个次要的语法注释-在
dt[i-expression]中不需要逗号)
quarter.diff <- function(Q1, Y1, Q2, Y2) {
  4L * (as.integer(Y2) - as.integer(Y1)) +
       (as.integer(Q2) - as.integer(Q1))
}

dt[quarter.diff(Q1, Y, Q2, Y2 = "2011")  > 0L &
   quarter.diff(Q1, Y, Q2, Y2 = "2011") <= 4L, ]
dt[{qdiff <- quarter.diff(Q1, Y, Q2, Y2 = "2011")
    qdiff > 0L & qdiff <= 4L}, ]