我有一个数据框,大部分是零(稀疏数据帧?)类似于
name,factor_1,factor_2,factor_3
ABC,1,0,0
DEF,0,1,0
GHI,0,0,1
实际数据大约是90,000行,包含10,000个功能 . 我可以将其转换为稀疏矩阵吗?我期望通过利用稀疏矩阵而不是数据帧来获得时间和空间效率 .
任何帮助,将不胜感激
更新#1:这是生成数据帧的一些代码 . 谢谢理查德提供这个
x <- structure(list(name = structure(1:3, .Label = c("ABC", "DEF", "GHI"),
class = "factor"),
factor_1 = c(1L, 0L, 0L),
factor_2 = c(0L,1L, 0L),
factor_3 = c(0L, 0L, 1L)),
.Names = c("name", "factor_1","factor_2", "factor_3"),
class = "data.frame",
row.names = c(NA,-3L))
4 回答
为了避免将所有数据复制到密集矩阵中,可能会有更高的内存效率(但速度更慢):
如果你有足够的内存,你应该使用理查德的答案,即将你的data.frame变成密集矩阵,而不是使用
Matrix
.我一直这样做,这是一个痛苦的屁股,所以我在我的R包中写了一个名为sparsify()的方法 - mltools . 它在
data.table
上运行,这些只是花哨data.frames
.解决你的具体问题......
Install mltools (or just copy the sparsify() method into your environment)
Load packages
Sparsify
通常,sparsify()方法非常灵活 . 以下是一些如何使用它的示例:
Make some data. Notice data types and unused factor levels
Out-Of-The-Box Use
Convert NAs to 0s and Sparsify Them
Generate Columns That Identify NA Values
Generate Columns That Identify NA Values In the Most Memory Efficient Manner
您可以将第一列设为行名,然后使用
Matrix
包中的Matrix
.原始
x
数据框的位置你的矩阵有多稀疏?这决定了如何改善它的大小 .
您的示例矩阵有3
1
s和60
s . 有了这个比例,天真地使用Matrix就节省了很多空间 .