Эффективно создать матрицу из кадра данных для большого набора данных - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь создать матрицу из большого кадра данных.Вот пример фрейма данных

df <- data.frame(index=c("x","y","j","ww","rr","ff"),
             a=c(1,3,3,5,1,6), 
             b=c(2,3,5,3,2,3),
             c=c(3,2,4,5,6,10),
             d =c("ha1","ha2","ha3","ha4","ha5","ha"))

> df
  index a b  c   d
1     x 1 2  3 ha1
2     y 3 3  2 ha2
3     j 3 5  4 ha3
4    ww 5 3  5 ha4
5    rr 1 2  6 ha5
6    ff 6 3 10  ha

Матрица должна выглядеть следующим образом.

> matrix
   a b  c
ff 6 3 10
j  3 5  4
rr 1 2  6
ww 5 3  5
x  1 2  3
y  3 3  2

Итак, подход, который я использовал, заключается в том, чтобы сначала изменить структуру фрейма данных на что-то вроде этого, используяmelt

df1 <- reshape2::melt(data = df, id.vars = c("index","d"), variable.name = "colname", value.name = "value")

> df1
   index   d colname value
1      x ha1       a     1
2      y ha2       a     3
3      j ha3       a     3
4     ww ha4       a     5
5     rr ha5       a     1
6     ff  ha       a     6
7      x ha1       b     2
8      y ha2       b     3
9      j ha3       b     5
10    ww ha4       b     3
11    rr ha5       b     2
12    ff  ha       b     3
13     x ha1       c     3
14     y ha2       c     2
15     j ha3       c     4
16    ww ha4       c     5
17    rr ha5       c     6
18    ff  ha       c    10

А затем выполните acast

matrix <- acast(df1, index~colname, value.var="value")

Вышеописанный подход работает, но сейчас я имею дело с большим набором данных, и когда данные преобразуются с использованием melt (df1), они становятся действительнобольшой и падает.

Так есть ли какой-нибудь способ, которым я могу сделать это эффективно при создании матрицы из кадра данных df, даже без промежуточного шага.

1 Ответ

0 голосов
/ 11 октября 2018

На основе выходных данных мы можем удалить первый столбец, который является столбцом character, преобразовать оставшуюся часть набора данных в matrix и назначить имена строк с первым столбцом

m1 <- `row.names<-`(as.matrix(df[-1]), df[,1])
str(m1)
# num [1:2, 1:3] 1 3 2 3 3 2
# - attr(*, "dimnames")=List of 2
#  ..$ : chr [1:2] "x" "y"
#  ..$ : chr [1:3] "a" "b" "c"
m1
#  a b c
#x 1 2 3
#y 3 3 2

Если мы используем tidyverse, то column_to_rownames полезно

library(tidyverse)
column_to_rownames(df, "x") %>%
      as.matrix

Обновление

На основе обновленного набора данных мы можем применить ту же логику после подстановки числовых столбцов

`row.names<-`(as.matrix(df[2:4]), df[,1])

Если имеется много столбцов numeric и получить индекс трудно, выполните цикл по столбцам, чтобы получить индекс числовых столбцов, и используйте его для поднабора

m2 <- `row.names<-`(df[sapply(df, is.numeric)], df[,1])[order(df[,1]),]
m2
#   a b  c
#ff 6 3 10
#j  3 5  4
#rr 1 2  6
#ww 5 3  5
#x  1 2  3
#y  3 3  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...