首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据准备中的问题

数据准备中的问题
EN

Stack Overflow用户
提问于 2013-08-21 08:11:12
回答 1查看 107关注 0票数 3

抱歉,标题不太明确。以下是感兴趣的data.table:

代码语言:javascript
复制
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中的值)。

代码语言:javascript
复制
dt_new
   K    Y Q1 Q2
1: A 2010  3  3
2: B 2010  4  1

的总结

Q2中的值(比如4)意味着:选择Q1中小于Y=2011的所有值,在Q1中选择等于或大于4的所有值(所以只有4),其中选择Y=2010。结果:3(2011)、2(2011)、1(2011)、4(2010)。此规则适用于Q2的所有值。所有这些都应该针对每个人。

我希望我的问题弄清楚了。我认为解决这个问题的方法有很多,但是由于我还在学习data.table,所以我想请您提供好的、优雅的解决方案(希望有这样的解决方案)。

谢谢

编辑:

几乎找到了一个解决方案:这给了我一个逻辑向量。如何提取数据集中的线条?

代码语言:javascript
复制
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

不这样做:

代码语言:javascript
复制
log <-dt[,(Q1<Q2 & Y=="2011")|(Q1>=Q2 & Y=="2010"),by="K"]$V1
dt[log]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-21 11:11:35

这是一个普通的逐行筛选,因此您不需要(或不应该)使用分组(by = "K"),只需:

代码语言:javascript
复制
dt[(Q1 < Q2 & Y == "2011") | (Q1 >= Q2 & Y == "2010"), ]

或者,如果你要使用的范围不仅仅是4宿舍,也许还会更灵活一些:

代码语言:javascript
复制
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, ]

这不仅是更一般的,它读起来要好得多,并使参考年份是2011年的假设明确。

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

最后,如果您担心quarter.diff被调用了两次,而速度是一个问题,您可以临时存储结果,如@Arun在注释中建议的那样:

代码语言:javascript
复制
dt[{qdiff <- quarter.diff(Q1, Y, Q2, Y2 = "2011")
    qdiff > 0L & qdiff <= 4L}, ]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18352122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档