我有这个数据框:
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
请问如何实现?
答案 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)