Существует ли пакет R с обобщенным классом data.frame, в котором столбец может быть массивом (или как определить такой класс)? - PullRequest
0 голосов
/ 02 марта 2019

Я долго размышлял об этом.Класс 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))).

1 Ответ

0 голосов
/ 02 марта 2019

фреймы данных допускают столбцы матрицы:

m <- diag(4)
v <- 1:4
DF <- data.frame(v, m = I(m))
str(DF)

, что дает:

'data.frame':   4 obs. of  2 variables:
 $ v: int  1 2 3 4
 $ m: 'AsIs' num [1:4, 1:4] 1 0 0 0 0 1 0 0 0 0 ...

Обновление 1

Функция R aggregate может создавать столбцы матрицы.Например,

DF <- data.frame(v = 1:4, g = c(1, 1, 2, 2))
ag <- aggregate(v ~ g, DF, function(x) c(sum = sum(x), mean = mean(x)))
str(ag)

дает:

'data.frame':   2 obs. of  2 variables:
 $ g: num  1 2
 $ v: num [1:2, 1:2] 3 7 1.5 3.5
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "sum" "mean"

Обновление 2

Я не думаю, что агрегация, обсуждаемая в комментариях, хорошо поддерживается в R, но вы можетеиспользуйте следующий обходной путь:

m <- matrix(1:16, 4)
v <- c(1, 1, 2, 2)
DF <- data.frame(v, m = I(m))

nr <- nrow(DF)
ag2 <- aggregate(list(sum = 1:nr), DF["v"], function(ix) colSums(DF$m[ix, ]))
str(ag2)

, дающий:

'data.frame':   2 obs. of  2 variables:
 $ v  : num  1 2
 $ sum: num [1:2, 1:4] 3 7 11 15 19 23 27 31
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...