3

タイトル不明ですみません。対象の 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 の値が人であるとしましょう。したがって、ここには 2 つあります。年の四半期は、Q1 と Q2 に格納されます。Q2 は一種の参照四半期変数であり、値は常に 2011 年に関連しています)。ここで、dt でこれらの行を選択したいと思います。ここで、K の各 Person について、Q1 は Q2 の値の 4 四半期前の間隔にあります。

例:
個人 A の Q2 の値は 3 であるため、値 2 (2011 年)、1 (2011 年)、4 (2010 年)、および 3 (2010 年) を選択する必要があります。このデータセットを考慮すると、これは行 2 になります。行 3 の値 Q1=4 は大きすぎます。行 1 の値 Q1=2 は小さすぎます。2 番目の人物「B」については、6 行目のみが選択されます。これはQ2と同じ四半期であるため、ライン4ではありません(Q2の値よりも小さいもののみが必要であり、ライン5は明らかにQ2の値よりも大きくなっています.

dt_new
   K    Y Q1 Q2
1: A 2010  3  3
2: B 2010  4  1

要約すると、
Q2 の値が 4 であるということは、Y=2011 の場合、Q1 の 4 より小さいすべての値を選択し、Y=2010 の場合、Q1 の 4 以上 (つまり 4) のすべての値を選択することを意味します。結果: 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]
4

1 に答える 1

4

これは標準的な行単位のフィルタリングであるため、グループ化 ( 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, ]

これはより一般的であるだけでなく、はるかに読みやすく、基準年が 2011 年であるという仮定を明確にします。

関数内ですべての列を整数に変換するのに注意を払ったことに注目してくださいquarter.diff。理想的には、年と四半期のデータは、文字や数値ではなく、整数として格納されているはずです。

最後に、quarter.diff2 回呼び出されて速度が懸念される場合は、コメントで @Arun が提案したように結果を一時的に保存できます。

dt[{qdiff <- quarter.diff(Q1, Y, Q2, Y2 = "2011")
    qdiff > 0L & qdiff <= 4L}, ]
于 2013-08-21T11:11:35.877 に答える