2016-05-12 5 views
0

利用可能な観測の間に欠けている私の(大)data.tableのすべてのケースを含む出力を探しています。R:(年)data.tableのアドレスデータギャップ

DT <- data.table(country=c(rep("DE",10),rep("AT",10)),time=rep(2001:2010,2), value=rnorm(20)) 
DT[country=="DE" &time %in% c(2001,2005,2006),"value"] <- NA 
DT[country=="AT" &time %in% c(2003,2008,2009,2010),"value"] <- NA 

私は私が2003にのみDE2005 & 2006AT中でdata.tableを作成することを可能にする機能を書きたいです。 this上の建物は、私はほとんどが午前、一つの国のためには、次のようになります。

test <-DT[country=="DE"] 
range <- range(test[!is.na(value),time]) 
sequence <- seq(range[1],range[2]) 
sequence[!sequence %in% test[!is.na(value),time]] 

そして今、私はdata.tablebyオプションでcountry渡って使用するには、この外の機能を作りたいです。ここに私の非稼働の例は次のとおりです。

#function to find datagaps (NA's) in a data.table (you still have to apply by group): 
#x is the name of the column which specifies your frequency (such as year or date) 
#y is the name of the column which has the NA's you're looking for 
#data is a data.table 

findgaps <- function(x,y,data){ 
range <- range(data[!is.na(y),x]) 
sequence <- seq(range[1],range[2]) 
return(sequence[!sequence %in% data[!is.na(y),x]]) 
} 
DT[findgaps(time,year,DT),.(country,time,value),by=country)] 

私の最高の推測では、関数が正しいフィルタ内でサブセットにdata.tableのための賢明な何かを、返さないということでしょうか?それはF、F、F、T、F、F、Fとなるはずです...何とか関数の出力としてベクトル?どんな助けもありがとう。

EDIT:所望の出力は次のようになります。最後に

output <- data.table(country=c("DE","DE","AT"), time=c(2005,2006,2003), value=c("NA","NA","NA")) 

を私はintrapolationのように、これで何かをしたいです。したがって、具体的にはDTの行に対処する方法は私にとっては問題ありません。おそらく、このような

+0

ご希望の出力は何ですか?あなたはそれをdata.tableとして提供できますか? – lmo

答えて

3

何か:

DT[, { r = rleid(is.na(value)) 
     idx = r > r[1] & r < tail(r, 1) & is.na(value) 
     .(time = time[idx], value = NA) 
    } 
    , by = country] 
+0

これは、たとえそれが欠落していなくても、すべての国を返すと思いますよね? –

+0

また、data.frameにあるかもしれない他の変数によって時間と値を使ってリストを拡張する方法を知っていますか?私は 'value = NA'を'%(Data)[!names(Data)%%c( "time")] 'に置き換えることを考えていましたが、それはうまくいきませんでした... –

+0

何とか、他の列でこの選択のために返されたいのですが... –