創建一組(可能很多)後驗分佈基本問題是:如何使用現有data.table的一列中的值作爲列名創建新的空data.table ?所以從這個:使用data.table
set.seed(1)
DT = data.table(x=c("a","b","c","d","e","f"), y=runif(6),key="x")
> DT
x y
1: a 0.2655087
2: b 0.3721239
3: c 0.5728534
4: d 0.9082078
5: e 0.2016819
6: f 0.8983897
我要自動執行data.table看起來像這樣(用數字列)的創建:
> POST
Empty data.table (0 rows) of 6 cols: a,b,c,d,e,f
提出這個問題在標題的背景: DT [,x]中的字符代表個人; DT [,y]中的值是當前迭代的後驗參數估計值。我這樣組織它,因爲它似乎是快速和直接的每行計算(計算可能性,接受/拒絕更新的值等)。但是,我想在另一個表中將y值存儲爲另一個表(個人(x)爲列,每個迭代在一行中的值(y))。這有助於下游,例如使其直接創建一個mcmc對象。
主要問題是我不知道如何自動創建一個空的data.table來保存後驗分佈,並將DT [,x]中的值作爲列名稱。我希望它看起來像這樣的第一次迭代之前:
POST<-data.table(a=numeric(0),b=numeric(0),c=numeric(0),
d=numeric(0),e=numeric(0),f=numeric(0))
> POST
Empty data.table (0 rows) of 6 cols: a,b,c,d,e,f
不過,我可能有很多人,我希望自動列X的DT轉換成POST列名。有什麼建議麼?
要追加DT [,Y]的新值,爲POST每次迭代,這似乎工作:
setkey(DT,x)
POST<-rbind(POST,data.table(t(DT[,.(y)])),use.names=FALSE)
總之,整個事情應該是這個樣子:
#Table used for calculations, with initial values#
set.seed(1)
DT = data.table(x=c("a","b","c","d","e","f"), y=runif(6),key="x")
#Table for storing posterior (*automate*)#
POST<-data.table(a=numeric(0),b=numeric(0),c=numeric(0),
d=numeric(0),e=numeric(0),f=numeric(0))
#for loop
#Modify values of y, then:
setkey(DT,x)
POST<-rbind(POST,data.table(t(DT[,.(y)])),use.names=FALSE)
編輯:基於Beauvel上校的迴應,我現在有這個,這產生了我想要的,但我還沒有想出如何在每次迭代中粘貼新列表元素的名稱:
#Create a list outside the loop
POST<- list()
#For loop
#First iteration:
POST$1<-data.table(t(DT[,y]));setattr(
POST$1, 'names', DT[,x])
#Second iteration:
POST$2<-data.table(t(DT[,y]));setattr(
POST$2, 'names', DT[,x])
#End of loop
> rbindlist(POST, use.names=TRUE)
a b c d e f
1: 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 0.8983897
2: 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 0.8983897
(忽略每行中的數字相同 - 這是做我想做的事情)。
什麼是你在循環中使用的功能? –
@Colonel Beauvel感謝您的回答,它幫助我產生了一些可行的方法(儘管毫無疑問仍然可以改進語法),我已經詳細解答了這個問題。我不知道約定是什麼,但我不想給出函數的具體細節。這是一個多步驟的過程,最初涉及一個更大的(長形式)data.table,每個人有許多行(每個人只有一個參數被估計,但是它是基於大量變量的值)。 – RichardB