data.frame со столбцом, содержащим матрицу в R - PullRequest
4 голосов
/ 26 мая 2011

Я пытаюсь поместить некоторые матрицы в фрейм данных в R, что-то вроде:

m <- matrix(c(1,2,3,4), nrow=2, ncol=2)
df <- data.frame(id=1, mat=m)

Но когда я это делаю, я получаю фрейм данных с 2 строками и 3 столбцами вместо фрейма данных с1 строка и 2 столбца.

Читая документацию, я должен экранировать свою матрицу, используя I ().

df <- data.frame(id=1, mat=I(m))

str(df)
'data.frame':   2 obs. of  2 variables:
 $ id : num  1 1
 $ mat: AsIs [1:2, 1:2] 1 2 3 4

Насколько я понимаю, информационный кадр содержит по одной строке для каждой строкиматрица, а поле mat - список значений столбцов матрицы.

Таким образом, как я могу получить кадр данных, содержащий матрицы?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 26 мая 2011

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

Попробуйте это, прокрутите и посмотрите, что происходит:

d <- data.frame(y=1:5,n=5)
g0 <- glm(cbind(y,n-y)~1,data=d,family=binomial)
debug(stats:::simulate.lm)
s <- simulate(g0,n=5)

Это странное решение.Создайте список, измените его класс на data.frame, а затем (это обязательно ) установите names и row.names вручную (если вы не сделаете эти последние шаги, данные все равно будутв объекте, но он будет распечатан так, как если бы он имел ноль строк ...)

m1 <- matrix(1:10,ncol=2)
m2 <- matrix(5:14,ncol=2)
dd <- list(m1,m2)
class(dd) <- "data.frame"
names(dd) <- LETTERS[1:2]
row.names(dd) <- 1:5
dd
4 голосов
/ 08 сентября 2011

Более простой способ сделать это - определить фрейм данных с заполнителем для матрицы.

m <- matrix(c(1, 2, 3, 4), nrow = 2, ncol = 2) 
df <- data.frame(id = 1, mat = rep(0, nrow(m)))

Затем назначить матрицу.Нет необходимости играть с классом списка или использовать функцию *apply().

df$mat <- m
2 голосов
/ 02 апреля 2017

Я столкнулся с той же проблемой, пытаясь понять данные о бензине в пакете pls .Использовал $ для работы.Сначала давайте создадим матрицу, назовем ее spectra_mat, а затем вектор response_var1.

spectra_mat = matrix(1:45, 9, 5)
response_var1 = seq(1:9)

Теперь мы поместим вектор response_var1 в новый фрейм данных - назовем его df.

df = data.frame(response_var1)
df$spectra = spectra_mat

Для проверки

str(df)

'data.frame':   9 obs. of  2 variables:
 $ response_var1: int  1 2 3 4 5 6 7 8 9
 $ spectra      : int [1:9, 1:5] 1 2 3 4 5 6 7 8 9 10 ...
1 голос
/ 26 мая 2011

Полученный результат (2 строки x 3 столбца) - это то, что следует ожидать от R, так как оно равняется cbind вектору (id, с повторным использованием) и матрице (m).

IMO, было бы лучше использовать list или array (когда измерения совпадают, не допускается сочетание числовых значений и значений факторов), если вы действительно хотите связать разные структуры данных. Иначе, просто cbind ваша матрица к существующему data.frame, если у обоих одинаковое количество строк, выполнит работу. Например

x1 <- replicate(2, rnorm(10))
x2 <- replicate(2, rnorm(10))
x12l <- list(x1=x1, x2=x2)
x12a <- array(rbind(x1, x2), dim=c(10,2,2))

и результаты читаются

> str(x12l)
List of 2
 $ x1: num [1:10, 1:2] -0.326 0.552 -0.675 0.214 0.311 ...
 $ x2: num [1:10, 1:2] -0.164 0.709 -0.268 -1.464 0.744 ...
> str(x12a)
 num [1:10, 1:2, 1:2] -0.326 0.552 -0.675 0.214 0.311 ...

Списки проще в использовании, если вы планируете использовать матрицу с различными размерами, и при условии, что они организованы таким же образом (для строк), что и внешние данные. Рамку вы можете также легко подгруппировать. Вот пример:

df1 <- data.frame(grp=gl(2, 5, labels=LETTERS[1:2]), 
                  age=sample(seq(25,35), 10, rep=T))
with(df1, tapply(x12l$x1[,1], list(grp, age), mean))

Вы также можете использовать функции lapply (для списка) и apply (для массива).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...