R 表格大表
我有一个巨大的表(数百万行和两列),类似于下面的表R 表格大表,r,large-data,R,Large Data,我有一个巨大的表(数百万行和两列),类似于下面的表 字段1字段2 M01 ABC M02 ABC MO3 ABC M03 CDE M04 FGH M05 LMN M06 FGH FIELD1可能有数百万个唯一值,FIELD2可能有多达10000个唯一值。 我在R中使用以下语句读取txt文件并将其制成表格: dat<-read.table(file.choose(new = FALSE), sep = "\t") m=table(dat) dat此解决方案使用单个read.csv.sql
dat<-read.table(file.choose(new = FALSE), sep = "\t")
m=table(dat)
dat此解决方案使用单个read.csv.sql
语句将数据读入SQLite数据库(它会自动创建),在数据库中执行计算(而不是在R中),然后仅在执行计算后将其读入R。因此,尽管它不做表
,但它仍然显示哪些FIELD1值与每个FIELD2值关联,并通过更紧凑的表示方式来实现
首先创建一些测试数据:
# create test file
test <- data.frame(FIELD1 = c("M01", "M02", "MO3", "M03", "M04", "M05", "M06"),
FIELD2 = c("ABC", "ABC", "ABC", "CDE", "FGH", "LMN", "FGH"))
write.csv(test, file = "test.csv", row.names = FALSE, quote = FALSE)
table
将尝试通过length(unique(FIELD2))
创建长度为的矩阵(unique(FIELD1))
,大概是原始数据大小的许多倍;一种更有效的表示方法是将计数作为数据帧,沿着
lst <- with(test, lapply(split(as.character(FIELD1), FIELD2), table))
df <- data.frame(FIELD1 = unlist(lapply(lst, names), use.names=FALSE),
FIELD2 = rep(names(lst), sapply(lst, length)),
Count = unlist(lst, use.names=FALSE))
您是否在read.table
部分或table
部分中得到错误?也就是说,在尝试将数据集制成表格之前,您是否成功地将数据集读入了R?的可能重复项也请查看bigmemory软件包。欢迎使用大数据。稍微有点奇怪,但如果您的示例准确,FIELD1可能存在数据清洁度问题。在第4行中,有MO3
而不是M03
。实际上我需要的是一个矩阵(Field1,Field2),我必须对它进行一些矩阵运算。我现在看到的唯一解决方案是一个向量接一个向量。矩阵包有一个稀疏的矩阵表示,这可能就足够了。
> DF
FIELD2 FIELD1
1 ABC M01,M02,MO3
2 CDE M03
3 FGH M04,M06
4 LMN M05
lst <- with(test, lapply(split(as.character(FIELD1), FIELD2), table))
df <- data.frame(FIELD1 = unlist(lapply(lst, names), use.names=FALSE),
FIELD2 = rep(names(lst), sapply(lst, length)),
Count = unlist(lst, use.names=FALSE))
library(Matrix)
m <- with(df, {
sparseMatrix(as.integer(FIELD1), as.integer(FIELD2), x=Count,
dimnames=list(levels(FIELD1), levels(FIELD2)))
})
> m
7 x 4 sparse Matrix of class "dgCMatrix"
ABC CDE FGH LMN
M01 1 . . .
M02 1 . . .
M03 . 1 . .
M04 . . 1 .
M05 . . . 1
M06 . . 1 .
MO3 1 . . .
> colSums(m)
[1] 3 1 2 1