【问题标题】:Converting R data.frame to matrix with levels of two factors as row and column names of the matrix将 R data.frame 转换为矩阵,其中两个因子的级别作为矩阵的行名和列名
【发布时间】:2025-12-26 02:55:12
【问题描述】:

我想将Rdata.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

【问题讨论】:

  • 分配一个合适的(dimdimnames)“矩阵”并使用类似mymat[as.matrix(df[c("B", "A")])] = df[["Y"]]的东西。另外,?xtabs
  • 感谢@alexis_laz 的评论。您能否更改您的评论以完成答案。谢谢
  • 我猜this 是更多替代品的完整帖子。

标签: r matrix dataframe tidyr


【解决方案1】:

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

【讨论】:

  • 善用acast,加1
  • 感谢@akrun 的赞赏。对于我的实际数据,我遇到了一个问题。我的结束对象包含一些NAs,现在我只想选择那些不包含NAsdf4 列。任何想法
  • 您可以尝试df4[!colSums(is.na(df4))] 过滤掉没有NA的列
  • 再次感谢@akrun 的帮助。我通过df4[, complete.cases(t(df4))]得到了想要的结果。