преобразовать фрейм данных в числовую матрицу - PullRequest
1 голос
/ 19 июня 2019

У меня есть этот фрейм данных:

df <- data.frame(
    column_names = c("x1", "x1", "x2", "x2")
    ,row_names = c("y1", "y2", "y1", "y2")
    ,n = c(1,2,3,4)
)

и я хотел бы преобразовать его в матрицу, подобную этой:

 x1 x2
y2 2 4
y1 1 3

Как мне этого добиться, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Вы можете использовать data.table::dcast для изменения формы данных, затем удалить столбец row_names, задать имена строк и упорядочить строки по убыванию.

out <- data.table::dcast(df, row_names ~ column_names, value.var = 'n')
out_mat <- as.matrix(out[, -1])
rownames(out_mat) <- out$row_names
out_mat <- out_mat[order(rownames(out_mat), decreasing = T),]

out_mat
#    x1 x2
# y2  2  4
# y1  1  3

или с тидиверсом

library(tidyverse)

df %>% 
  spread(column_names, n) %>% 
  arrange(desc(row_names)) %>% 
  column_to_rownames('row_names') %>% 
  as.matrix

#    x1 x2
# y2  2  4
# y1  1  3
1 голос
/ 19 июня 2019

Это даст вам точный вывод, который вы запрашивали (matrix с именами строк и столбцов, упорядоченные по убыванию y):

library(dplyr)

mtx <- df %>% 
  group_by(row_names) %>%
  arrange(column_names) %>% 
  summarise(out=list(n)) %>% 
  arrange(desc(row_names)) %>% 
  pull(out) %>% 
  do.call('rbind', .)

rownames(mtx) <- df %>% 
  distinct(row_names) %>% 
  arrange(desc(row_names)) %>% 
  pull(row_names)

colnames(mtx) <- df %>% 
  distinct(column_names) %>% 
  arrange(column_names) %>% 
  pull(column_names)
1 голос
/ 19 июня 2019

Вы можете сделать это с помощью tidyr:

library(tidyr)
df <- spread(df, column_names, n)
df <- df[order(df$row_names, decreasing = TRUE),]

Отредактировано для уменьшения значений y.

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