无法为向量分配内存

时间:2018-12-23 14:34:38

标签: r

setwd("C:/Great Learning Sessions")
getwd()

mydata<-read.csv('Coffee1.csv')
brand_popular<-mydata[mydata$No_of_Packet,mydata$Brand]
brand_popular

我得到如下错误:我无法为向量brand_popular

分配内存
brand_popular<-mydata[mydata$No_of_Packet,mydata$Brand]
  

错误:无法分配大小为512 Kb的向量

2 个答案:

答案 0 :(得分:1)

这个问题上有很多事情,我认为其中一些可能会使R初学者感到困惑,特别是如果您是从另一种统计软件包或电子表格中获得R的。此外,其中的一些功能乍一看似乎并不统一,但最终看起来很自然。

此问题的部分原因是您的内存问题掩盖了另一个问题,这是您进行子设置的方式。解决子集问题最有可能解决内存问题。

R中的数据框子集可以集中在行,列或两者上。您可以选择整个列或整个行,也可以基于布尔语句选择行或列(可以将其评估为TRUE或FALSE)。对于您的情况,您想选择具有特定名称的整个列。因此,您只想提供特定的名称。有两种方法可以达到相同的结果。

 identical(iris[c("Sepal.Length","Petal.Length")],
          iris[,c("Sepal.Length","Petal.Length")])

请注意两者之间的细微差别。第一个只是给出向量中所需列的名称。这利用了以下事实:数据框也是列表(列),并且您可以使用列表元素的名称(在这种情况下为列名称)对列表进行子集化。第二个利用以下事实,即数据帧的工作方式类似于矩阵(可以具有不同类型的数据,这使得它不是R中的矩阵)。像矩阵一样,您可以通过行和列来引用它的一部分,行,列之间用逗号分隔。这意味着,如果需要多个行或列,则需要提供它们作为使用c()创建的向量。

但是,请务必注意,您引用列的方式(使用$)不是正确的方式。这实际上是将整个数据列引用为向量(或在tidyverse中将其引用为带有一列的小标题)。换句话说,如果iris$Petal.Length并不是说让我使用此名称的列,而是说让我使用具有与iris的Petal.Length列中的值匹配的名称的所有列。

在您的原始代码中,这变得更加复杂,因为它告诉我所有行名称都在“ Brand”列中具有值的行,因为Brand可能不包含该行,这将引起各种问题唯一值和行名应该唯一。

为了学习,我建议您使用像虹膜这样的小型数据集尝试所有这些变体(以及更多),以便您可以看到在内存不足之前可能发生的各种错误消息。

添加:

只需为此添加更多内容……您可能使用了$表示法,因为您之前在子集的上下文中看到或使用过它,但通常在使用布尔值进行子集的上下文中会看到或使用过它。陈述。例如

iris[iris$Sepal.Length  > 5,]

将Sepal.Length值大于5的那些子集化。它通过创建一个单独的逻辑矢量来完成此操作,该逻辑矢量具有与iris相同的行数,并且对于这些行,其值为TRUE Sepal.Length> 5且其他行为false的行。然后,仅保留与另一个向量中的TRUE行匹配的那些行。这是等效的。

  x <- iris$Sepal.Length  > 5
  iris[x,]

要对列使用逻辑语句的相同思想,您需要一个逻辑向量,该逻辑向量的长度与要保留的列名称的向量相同。例如,colnames()给我们列名的向量,然后       x <-c(“ Species”,“ Sepal.Length”)       姓氏(虹膜)%in%x 给我们一个逻辑向量

  [1]  TRUE FALSE FALSE FALSE  TRUE

如此

   iris[, colname(iris) %in% x]

将仅在语句为真的两列的情况下为我们提供数据框。在您要创建一个可以接受任意列名称列表作为子集的函数之前,这似乎很复杂。

答案 1 :(得分:-2)

您可以尝试设置更大的内存限制,例如

memory.limit(size = 2500)

其中大小的数字以兆字节为单位。