【发布时间】:2020-12-28 02:00:31
【问题描述】:
我正在使用包含 803 个变量的大型数据集 562792 obj 我想根据第六个变量的值对我的数据进行子集化
我的数据集如下所示:(只有 5*10 的数据集子集)
seq start end name score annotation GC NA NA.1
PCPG_2 chr1 17238 17739 PCPG_2 4.406228 Promoter 0.6127745 0.4791137 0.4321641
LIHC_2 chr1 102709 103210 LIHC_2 3.472406 Intron 0.4491018 -1.4821049 -1.1310495
LIHC_3 chr1 136494 136995 LIHC_3 8.211594 Distal 0.7065868 -0.6996327 -0.5816772
TGCT_2 chr1 180653 181154 TGCT_2 7.718365 Distal 0.5588822 1.5983810 1.6995938
LGG_2 chr1 181202 181703 LGG_2 67.948112 Distal 0.7584830 2.9480593 3.2586839
NA.2
PCPG_2 0.5570205
LIHC_2 -1.3443903
LIHC_3 -1.5895320
TGCT_2 1.6474305
LGG_2 1.7238597
基本上我想删除带有“Promoter”注释的行。我使用此代码根据“注释”变量对我的数据进行了子集化
promoters<-which(dataset[,6]=="Promoter")
dataset[-promoters,]
然后 R 弯腰响应并崩溃
我还使用了命令 subset 并且 R 会话停止工作。
由于我是 R 新手,我无法准确检测到问题,但我认为这是因为这个大数据占用了太多内存。
谁能帮我解决这个问题或建议一种更有效的方法来从数据集中删除对象?
【问题讨论】:
-
dataset[ dat$annotation != "Promoter", ]或subset(dataset, annotation != "Promoter")都应该工作。您可能需要小心使用您的which代码...如果没有找到,它将返回integer(0),并且dataset[-integer(0),]返回零行,而不是您想要的。在这里使用logical而不是integer索引可能会更好;使用您的代码,dataset[!dataset[,6] == "Promoter",]或dataset[dataset[,6] != "Promoter",]也应该可以工作。 -
@r2evans 我确实尝试了
dataset[ dataset[ ,6]!="Promoter", ]和subset都崩溃了。我认为那是因为我的数据集很大。我用较小的数据集尝试了这段代码,它确实有效,但在我的实际数据集上没有。 -
我相信一般
data.frames,删除一行会将整个框架复制到一个新对象中。我认为data.table可能能够避免这种情况,但that issue 似乎仍然开放。是的,大数据肯定会带来挑战。我听说过(没有尝试过)disk.frame的好东西,但缺乏这些......也许数据库更适合您的数据。