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

时间:2018-01-22 19:37:59

标签: r data.table

我的数据基本上是一个矩阵,但是采用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循环。然后,根据colnames将200101和200102合并到dtB中。

在data.table中有一种聪明的方法吗? 非常感谢

2 个答案:

答案 0 :(得分: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")))

答案 1 :(得分:1)

如果您已经有一个真正的矩阵,如:

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

不需要依赖项。

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

  

继承自类as.data.frame的对象的"table"方法可以   用于转换基于数组的意外事件表示   表到包含分类因子和数据的数据框   相应的条目(后者作为responseName命名的组件)。   这是xtabs的反转。

当然,如果您愿意,可以as.data.table( as.table(x) )melt