将 R data.frame 转换为矩阵,其中两个因子的水平作为矩阵的行名和列名
Converting R data.frame to matrix with levels of two factors as row and column names of the matrix
我想将 R
data.frame
转换为 matrix
,其中两个因子的水平作为矩阵的行名和列名。这是一个MWE。获得所需结果需要大量代码,因此可能会有更紧凑的代码。
set.seed(12345)
A <- c("A1", "A2")
B <- c("B1", "B2", "B3")
Y <- runif(n=6, min=100, max=1000)
df <- data.frame(expand.grid(A=A, B=B), Y)
df
# A B Y
# 1 A1 B1 748.8135
# 2 A2 B1 888.1959
# 3 A1 B2 784.8841
# 4 A2 B2 897.5121
# 5 A1 B3 510.8329
# 6 A2 B3 249.7346
library(tidyr)
df1 <- spread(data = df, key = A, value = Y, fill = NA, convert = FALSE, drop = TRUE)
df1
# B A1 A2
# 1 B1 748.8135 888.1959
# 2 B2 784.8841 897.5121
# 3 B3 510.8329 249.7346
m1 <- as.matrix(df1[,-1])
rownames(m1) <- df1[ ,1]
m1
# A1 A2
# B1 748.8135 888.1959
# B2 784.8841 897.5121
# B3 510.8329 249.7346
可以使用 reshape2
包中的 acast
函数来完成。
df4 <- reshape2::acast(df, B ~ A, value.var="Y")
df4
# A1 A2
# B1 748.8135 888.1959
# B2 784.8841 897.5121
# B3 510.8329 249.7346
我想将 R
data.frame
转换为 matrix
,其中两个因子的水平作为矩阵的行名和列名。这是一个MWE。获得所需结果需要大量代码,因此可能会有更紧凑的代码。
set.seed(12345)
A <- c("A1", "A2")
B <- c("B1", "B2", "B3")
Y <- runif(n=6, min=100, max=1000)
df <- data.frame(expand.grid(A=A, B=B), Y)
df
# A B Y
# 1 A1 B1 748.8135
# 2 A2 B1 888.1959
# 3 A1 B2 784.8841
# 4 A2 B2 897.5121
# 5 A1 B3 510.8329
# 6 A2 B3 249.7346
library(tidyr)
df1 <- spread(data = df, key = A, value = Y, fill = NA, convert = FALSE, drop = TRUE)
df1
# B A1 A2
# 1 B1 748.8135 888.1959
# 2 B2 784.8841 897.5121
# 3 B3 510.8329 249.7346
m1 <- as.matrix(df1[,-1])
rownames(m1) <- df1[ ,1]
m1
# A1 A2
# B1 748.8135 888.1959
# B2 784.8841 897.5121
# B3 510.8329 249.7346
可以使用 reshape2
包中的 acast
函数来完成。
df4 <- reshape2::acast(df, B ~ A, value.var="Y")
df4
# A1 A2
# B1 748.8135 888.1959
# B2 784.8841 897.5121
# B3 510.8329 249.7346