Iは、次のデータがあると:R data.table距離
d = data.table(id = 1, x = c(1, 10, 17, 35, 37, 45))
IはグループIDによってxの各i番目の要素は、30〜要素を有しているかどうかを確認しますそれよりも大きい40。だから、xの最初の要素のid(1)で、1の後のxの値が31と41の間にあるかどうか調べたいと思います。答えはyesです。最初の要素ではTRUEです。最後に、私は、取得するために探しています:
d_final = data.table(id = 1, x = c(1, 10, 17, 35, 37, 45), valid_gap = c(T, T, F, F, F, F))
私はしばらくのために同僚と、この質問について考えてきた、と私たちは本当にここにループを使用しないようにしようとしているが、理解することはできませんそれを出す。これはループなしでも可能ですか?
私の最高の試みのようなものです:
d[, valid_gap := any(between(rdist(x[ .N - .I ])[,1], left = 30, right = 40)), by = id]
が、私は間違った考えである疑いがあるループにいるかのようにXによってインデックスにしようとして問題を考えています。
EDIT - "悪い" ソリューション:
x = c(1, 10, 17, 35, 37, 45)
valid_gap = c()
for(i in 1:length(x)) {
if(i == length(x)){
valid_gap = c(valid_gap, F)
} else {
valid_gap = c(valid_gap, any(between(rdist(x[ x >= x[i] ])[,1], left = 30, right = 40)))
}
}
valid_gap
事前にありがとうございます!私は非エクイが参加推測
また、次のようになります。[x> = x [i]])[、1]、left = 30、right = 40) (findInterval(x + 40、x)> i30) ' –
@alexis_lazありがとう、それはそれを行うクールな方法です。私はそれが別の答えのために十分に異なっていると思うが、あなたが好きならそれをここに加えることができる。 left.openオプション(x = c(0、30)がc(TRUE、FALSE)を与えるようにする)や、間隔の閉じた/開いた状態を微調整するのに関連するものfindIntervalを使って)。 – Frank
あなたは 'left.open = TRUE'について正しいでしょう。それを逃した。また、ソートされた "x"だけを受け入れます。確かに 'findInterval'はそれを使う方法を少し調べる必要があります - 私は、引数の' expand.grid'に 'Map'を使ってすべての可能な使い方を調べています:)。私はそれがあなたの答えに追加することができると思います - それを "グループで"ラップすると、あなたの答えにさらに近づくでしょう。 –