如何在R中将矩阵转换为data.table

5

我有一份数据,本质上是一个矩阵,但格式为data.table:

我们将其称为matA:

Date    compA compB compC 
200101      1     2     3 
200102      2     4     1    

如何将矩阵转换为data.table中的数据库类型?

我们称这个数据集为dtB:

Date    Company    Data
200101    compA       1
200101    compB       2
200101    compC       3
200102    compA       2
200102    compB       4
200102    compC       1

我想到了一种非常愚蠢的方法来列举公司:

comp= as.data.table(c("compA", "compB", "compC"))
date= as.data.table(rep(matA[1,1],3))
data= as.data.table(matA[1,])

dtb= date[,Company := comp]
dtb= dtb[, Data := data]

显然,我最多只能获得200101日期的数据。为了获取200102,我会编写一个for循环。然后,根据列名将200101和200102合并到dtB中。

在data.table中有没有聪明的方法来做到这一点呢?非常感谢。


你们是怎么记住所有的函数的?我总是试错... 不过这样也可以。 - Gabriel
1
顺便说一句,非常感谢!还需要更多的试错! - Gabriel
1
我认为我们都处于试错阶段。我们中的一些人只是在错误方面花费了太多时间,开始更快地转向试验方面。 :) - Benjamin
1
还可以在谷歌/stackoverflow上搜索正确的术语。例如,这将是一个“从宽到长格式重塑”的问题,这将为您提供类似于的stackoverflow问题。 - acylam
是的,问题在于我经常在stackoverflow上查找,但总是很难用正确的术语搜索到所需内容! - Gabriel
data.table 包也有一个 melt 命令。 - G. Grothendieck
2个回答

3
如果您已经拥有一个真正的矩阵,比如:
matA <- 
  as.matrix(
    read.table(text=
      "Date    compA compB compC 
      200101      1     2     3 
      200102      2     4     1",
      header=TRUE,
      row.names=1)
  )
names(dimnames(matA)) <- c('Date','Company')
matA
#        Company
#  Date   compA compB compC
#  200101     1     2     3
#  200102     2     4     1

如果您想将数据框转换为表格,可以使用基本的as.data.frame(as.table(x))函数。

as.data.frame(
  as.table(matA),
  responseName = 'Data'
)

#     Date Company Data
# 1 200101   compA    1
# 2 200102   compA    2
# 3 200101   compB    2
# 4 200102   compB    4
# 5 200101   compC    3
# 6 200102   compC    1

无需任何依赖。

这利用了table类的as.data.frame()方法:

as.data.frame方法用于继承自类"table"的对象,可以将基于数组的列联表表示转换为包含分类因子和相应条目(后者作为由responseName命名的组件)的数据帧。 这是xtabs的逆过程。

当然,如果您愿意,可以使用as.data.table(as.table(x))或进行melt操作。


2

基础 R

data.frame(Date = matA[,"Date"],
           Company = rep(colnames(matA)[-1], each = NROW(matA)),
           Data = as.vector(matA[,-1]))
#    Date Company Data
#1 200101   compA    1
#2 200102   compA    2
#3 200101   compB    2
#4 200102   compB    4
#5 200101   compC    3
#6 200102   compC    1

data.table

library(data.table)
melt(data = as.data.table(matA),
     id.vars = "Date",
     variable.name = "Company",
     value.name = "Data")
#     Date Company Data
#1: 200101   compA    1
#2: 200102   compA    2
#3: 200101   compB    2
#4: 200102   compB    4
#5: 200101   compC    3
#6: 200102   compC    1

数据

matA = structure(c(200101L, 200102L, 1L, 2L, 2L, 4L, 3L, 1L), .Dim = c(2L, 
4L), .Dimnames = list(NULL, c("Date", "compA", "compB", "compC")))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接