【问题标题】:Coverting a data frame to matrix in R在R中将数据框转换为矩阵
【发布时间】:2017-09-05 09:10:52
【问题描述】:

我想将数据框转换为 R 中的矩阵,如下例所示:

df
row.index   column.index   matrix element
1           1              A
1           2              B
2           1              C
2           2              D

matrix
A  B
C  D

是否可以对行名做同样的事情?例如

df
row.name   column.name   matrix element
X          P             A
X          Q             B
Y          P             C
Y          Q             D

matrix
     P  Q

X    A  B
Y    C  D

感谢您的帮助!

【问题讨论】:

  • 对于案例 1 matrix(df$matrixelement, nrow = max(df$row.index), byrow = TRUE) 似乎可以解决问题。对于 nrow 中的案例 2 length(unique(df1$row.name)) 会这样做。然后你可以设置colnames和rownames

标签: r matrix dataframe


【解决方案1】:

我们可以使用tapply

tapply(df$matrixelement, df[1:2], FUN = I)

它也适用于第二个数据集

res <- tapply(df1$matrixelement, df1[1:2], FUN = I)
names(dimnames(res)) <- NULL
res
#   P   Q  
#X "A" "B"
#Y "C" "D"

如果我们需要data.frame,则可以使用dcast

library(reshape2)
dcast(df, row.index ~column.index)

数据

df <- structure(list(row.index = c(1L, 1L, 2L, 2L), column.index = c(1L, 
2L, 1L, 2L), matrixelement = c("A", "B", "C", "D")), .Names = c("row.index", 
"column.index", "matrixelement"), class = "data.frame", row.names = c(NA, 
-4L))

df1 <- structure(list(row.name = c("X", "X", "Y", "Y"), column.name = c("P", 
"Q", "P", "Q"), matrixelement = c("A", "B", "C", "D")), .Names = c("row.name", 
"column.name", "matrixelement"), class = "data.frame", row.names = c(NA, 
-4L))

【讨论】:

  • 我在 tapply 上收到一个错误:sort.list(y) 中的错误:'x' 必须是 'sort.list' 的原子 你在列表上调用过'sort'吗?
  • @mac 我假设你有一个 data.frame 作为输入。请检查我帖子中的数据。将您的数据(可能是矩阵)转换为 data.fframe 然后运行它,即df &lt;- as.data.frame(df) 并再次尝试代码
  • 这是一个data.table。我错误地认为 data.table 总是表现得像 data.frame
  • @mac 对于我显示的数据,它是matrix 即is.matrix(res) #[1] TRUE 在这里,我们假设组的长度组合是相同的
  • @mac 如果不是对称的,最好在分组变量创建序列列后使用dcast
猜你喜欢
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 2019-09-20
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多