Основной вопрос: как создать новую пустую таблицу данных, используя значения в одном столбце существующей таблицы данных в качестве имен столбцов ? Так что с этого:Создание набора (возможно, многих) задних распределений итерационно с использованием 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
Но у меня может быть много людей, и я хочу, чтобы автоматизировать преобразование столбца х в DT в имена столбцов для POST. Какие-либо предложения?
Для добавления новых значений DT [, у], чтобы 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)
EDIT: на основании ответа полковника Бовела у меня теперь есть это, которое производит то, что я хочу, но я еще не понял, как вставить имя для нового элемента списка на каждой итерации:
#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