Я долго размышлял об этом.Класс data.frame в базе R позволяет столбцам быть векторами.Я искал пакет, который обобщает это так, чтобы каждый «столбец» мог быть 2-м или даже 2-м массивом с методами, аналогичными исходному классу data.frame, например, поднабором с «[]», слиянием, агрегатом,и т.д.
Моя причина для такого класса - иметь дело с данными моделирования Монте-Карло.Например, для каждого моделирования результат может быть выражен в виде фрейма данных, в котором индексы строк являются датами, а столбцы содержат символьные и числовые значения.Если я имитирую 1000 раз, то получаю 1000 таких фреймов данных.Если в R есть класс, с помощью которого я могу хранить результаты в одном объекте и который удобен для большинства методов data.frame, это значительно облегчит мое кодирование.
Как я не могЯ не смог найти такой пакет, но попытался создать свой, но безуспешно.Я наткнулся на этот пакет «S4Vectors» с классом «DataFrame», который «поддерживает хранение любого типа объекта (с длиной и [методы) в виде столбцов».Вот моя попытка.
library(S4Vectors)
test <- matrix(1:6,2,3)
test1 <- matrix(7:12,2,3)
setClass("Column", slots=list(), contains = "matrix")
setMethod("length", "Column", function(x) {nrow(x)})
'[.Column' <- function(x, i, j, ...) {
i <- ((i-1)*ncol(x)+1):(i*(ncol(x)))
NextMethod()
}
testColumn <- new("Column", test)
testColumn1 <- new("Column", test1)
length(testColumn)
testColumn[1]
testDataFrame <- DataFrame(Col1 = testColumn, Col2 = testColumn1)
Я получил длину и [метод для работы, но последний оператор выдает ошибку "не может привести класс" Столбец "к DataFrame".
Кто-нибудь когда-нибудь пытался сделать что-то подобное?
Обновление: благодаря Дж. Гротендику теперь я знаю, что фрейм данных может принимать матрицу в виде столбца с помощью функции I ().Теперь мне интересно, есть ли способ сохранить такую структуру во всех операциях.Примером может быть агрегирование фрейма данных
data.frame(v = c(1,1,2,2), m = I(diag(4)))
по v, чтобы получить результат
data.frame(v = c(1,2), m = I(matrix(c(1,1,0,0,0,0,1,1), 2, 4, byrow = T)))
.