Вот некоторые возможности. Первые 3 используют только базовую R.
1) tapply Используйте tapply
с частями строки и столбца, указанными во втором аргументе.
nms <- names(x)
tapply(x, list(row = sub(".*\\.", "", nms), col = sub("\\..*", "", nms)), c)
, даваяследующая матрица с указанными именами строк и столбцов.
col
row a b c
0 2 4 3
1 7 6 9
2) xtabs Другая возможность заключается в использовании xtabs
:
dnms <- read.table(text = names(x), sep = ".", as.is = TRUE,
col.names = c("col", "row"))[2:1]
xtabs(x ~ ., dnms)
, задающем этот xtabs /объект таблицы:
col
row a b c
0 2 4 3
1 7 6 9
3) изменить форму
long <- cbind(x, read.table(text = names(x), sep = ".", as.is = TRUE,
col.names = c("col", "row")))
r <- reshape(long, dir = "wide", idvar = "row", timevar = "col")[-1]
dimnames(r) <- lapply(long[3:2], unique)
r
с указанием этих данных. кадр:
a b c
0 2 4 3
1 7 6 9
4)dplyr / tidyr / tibble Используя указанные пакеты, мы можем сформировать следующий конвейер:
library(dplyr)
library(tidyr)
library(tibble)
x %>%
stack %>%
separate(ind, c("col", "rowname")) %>%
pivot_wider(names_from = col, values_from = ".") %>%
column_to_rownames
с указанием этих data.frame:
a b c
0 2 4 3
1 7 6 9
Если вы используете старую версиюиз tidyr замените строку pivot_wider
на
spread(col, values) %>%
В соответствии с комментарием @db это также будет работать:
x %>%
data.frame %>%
rownames_to_column %>%
separate(rowname, c("col", "rowname")) %>%
pivot_wider(names_from = col, values_from = ".") %>%
column_to_rownames