【问题标题】:problems with data preparation数据准备问题
【发布时间】:2013-08-23 12:17:10
【问题描述】:

抱歉,标题不明确。这是感兴趣的 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]

【问题讨论】:

    标签: r data.table


    【解决方案1】:

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

    dt[(Q1 < Q2 & Y == "2011") | (Q1 >= Q2 & Y == "2010"), ]
    

    或者如果您要使用除4 宿舍以外的范围,则可能会更灵活:

    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, ]
    

    这不仅更笼统,而且读起来更好,并使 reference-year-is-2011 假设明确。

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

    最后,如果您担心quarter.diff 被调用两次并且速度是一个问题,您可以按照@Arun 在 cmets 中的建议临时存储结果:

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

    【讨论】:

    • 您可以通过将结果分配给变量来减少对quarter.diff 的双重调用,例如w,然后执行:which(w &gt; 0L &amp; w &lt;= 4L),您可以这样做:dt[quarter.diff(Q1, Y, Q2, Y2="2011")]
    • 一个小的语法注释——dt[i-expression]中不需要逗号
    猜你喜欢
    • 2016-11-16
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多