将数据框转换为数值矩阵

时间:2019-06-19 16:08:06

标签: r

我有这个数据框:

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 个答案:

答案 0 :(得分:2)

您可以使用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

或者使用tidyverse

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 :(得分:1)

您可以使用tidyr进行此操作:

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

为减少y值而编辑。

答案 2 :(得分:1)

这将为您提供所需的确切输出(带有行名和列名的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)