我的数据基本上是一个矩阵,但是采用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中有一种聪明的方法吗? 非常感谢
答案 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
。