R:将N*M data.frame(或data.table)转换为(N*M)*3 data.frame

R:将N*M data.frame(或data.table)转换为(N*M)*3 data.frame,r,format,dataframe,data.table,R,Format,Dataframe,Data.table,我正在使用data.table包从磁盘读取(fread)更大的文件。读取的data.table如下所示 C1, C2, C3 R1 0.5, 0.9, 0.1 R2 0.7, 0.1, 0,1 R3 0.2, 0.3, 0,5 但是,对于扫描问题,我希望采用以下形式: R1, C1, 0.5 R1, C2, 0.9 R1, C3, 0.1 R2, C1, 0.7 那么,有没有一种有效的方法可以做到这一点?当使用rbind、cbind等时,这需要花费很长时间。 我正在读取的文

我正在使用data.table包从磁盘读取(fread)更大的文件。读取的data.table如下所示

   C1,  C2,   C3
R1 0.5, 0.9,  0.1
R2 0.7, 0.1,  0,1
R3 0.2, 0.3,  0,5
但是,对于扫描问题,我希望采用以下形式:

R1, C1, 0.5
R1, C2, 0.9
R1, C3, 0.1
R2, C1, 0.7
那么,有没有一种有效的方法可以做到这一点?当使用rbind、cbind等时,这需要花费很长时间。 我正在读取的文件有~500k行~100列

致以最良好的祝愿


马里奥

如有需要,保持线路畅通:

从dataframe开始:

dt = data.frame(c1=c(0.5,0.7,0.2), c2=c(0.9,0.1,0.3), c3=c(0.1,0.1,0.5))
row.names(dt) = c("R1","R2","R3")
melt(as.matrix(dt))
从data.table开始,您不能仅获取行:

dt = data.frame(c1=c(0.5,0.7,0.2), c2=c(0.9,0.1,0.3), c3=c(0.1,0.1,0.5))
melt(as.matrix(dt))

help(“melt.data.table”)
melt是正确的提示,谢谢。我不知道。奇怪的是,虽然这个答案已经被提升并被接受,但它没有意义--
数据。表
s没有
行名
,所以
as.matrix
会让事情变慢……但是如果他们把数据读成
data.frame
,这是有意义的。我没有使用这个代码,我只是把melt和melt.data.table作为起点。@mariodeng,
melt
是最符合逻辑的候选者——我只是指出,在使用
fread
获取数据的情况下,答案没有意义。但是,您的问题确实显示了一些类似于行名称的内容。您可能需要在问题中澄清您的数据实际上是什么样子的——可能是通过
dput(head(无论您在中读到什么))
的输出。上校——很抱歉,复选标记被删除了——这不是我的本意!只是想让你得到一个更好的答案:-)