R 执行这些步骤所需内存最少的方法是什么?

R 执行这些步骤所需内存最少的方法是什么?,r,memory,R,Memory,我已经发了帖子,得到了专家们的好评。然而,我现在面临另一个问题,我发现这些工作无法在我的真实数据中完成,因为我的起始文件df1太大了。我想知道是否有更快的方法来做同样的工作,而不使用adply或for循环 我的原始问题如下: 步骤1:我有一个简化的数据帧,如下所示: df1 = data.frame (B=c(1,0,1), C=c(1,1,0) , D=c(1,0,1), E=c(1,1,0), F=c(0,0,1) , G=c(0,1,0), H=c(0,0,1), I=c(0,1,

我已经发了帖子,得到了专家们的好评。然而,我现在面临另一个问题,我发现这些工作无法在我的真实数据中完成,因为我的起始文件df1太大了。我想知道是否有更快的方法来做同样的工作,而不使用adply或for循环

我的原始问题如下:

步骤1:我有一个简化的数据帧,如下所示:

df1 = data.frame (B=c(1,0,1), C=c(1,1,0)
  , D=c(1,0,1), E=c(1,1,0), F=c(0,0,1)
  , G=c(0,1,0), H=c(0,0,1), I=c(0,1,0))

  B C D E F G H I
1 1 1 1 1 0 0 0 0
2 0 1 0 1 0 1 0 1
3 1 0 1 0 1 0 1 0
第二步:我想做行减法,即第1行-第2行、第1行-第3行和第2行-第3行

row1-row2    1  0    1  0    0  -1   0  -1
row1-row3    0  1    0  1   -1   0  -1   0
row2-row3   -1  1   -1  1   -1   1  -1   1
步骤3:将所有-1替换为0

row1-row2   1   0   1   0   0   0   0   0
row1-row3   0   1   0   1   0   0   0   0
row2-row3   0   1   0   1   0   1   0   1

你能教我如何用一种内存要求较低的方法来完成这项工作吗?

我知道执行步骤2的最快方法是使用df1中的索引来进行各种成对比较。combn函数可用于生成所需的逐行比较集。这将是大数据集的限速步骤

对于我们要形成的逐行操作组合:

> cmb <- combn(as.numeric(rownames(df1)), 2)
> cmb
     [,1] [,2] [,3]
[1,]    1    1    2
[2,]    2    3    3
现在可以执行步骤3,尽管我假设结果输出中只能有1、0和-1个值:

> out[out < 0] <- 0
> out
    B C D E F G H I
1   1 0 1 0 0 0 0 0
1.1 0 1 0 1 0 0 0 0
2   0 1 0 1 0 1 0 1
它可以用作:

> rownames(out) <- apply(cmb, 2, function(x) paste("row", x[1], "-row", x[2], sep = ""))
> out
          B C D E F G H I
row1-row2 1 0 1 0 0 0 0 0
row1-row3 0 1 0 1 0 0 0 0
row2-row3 0 1 0 1 0 1 0 1

我所知道的执行步骤2的最快方法是使用df1中的索引进行各种成对比较。combn函数可用于生成所需的逐行比较集。这将是大数据集的限速步骤

对于我们要形成的逐行操作组合:

> cmb <- combn(as.numeric(rownames(df1)), 2)
> cmb
     [,1] [,2] [,3]
[1,]    1    1    2
[2,]    2    3    3
现在可以执行步骤3,尽管我假设结果输出中只能有1、0和-1个值:

> out[out < 0] <- 0
> out
    B C D E F G H I
1   1 0 1 0 0 0 0 0
1.1 0 1 0 1 0 0 0 0
2   0 1 0 1 0 1 0 1
它可以用作:

> rownames(out) <- apply(cmb, 2, function(x) paste("row", x[1], "-row", x[2], sep = ""))
> out
          B C D E F G H I
row1-row2 1 0 1 0 0 0 0 0
row1-row3 0 1 0 1 0 0 0 0
row2-row3 0 1 0 1 0 1 0 1

直接使用sqldf包或RSQLite将允许在R之外完成所有计算,因此不需要中间存储。我们使用sqldf进行了说明。有关更多信息,请参阅

在这种方法中的备选方案1注意,我们使用dbname=tempfile,以便它在一个外部数据库中执行所有计算,该数据库会动态创建并自动删除,而不是在内存中执行

library(sqldf)
gc()
DF <- sqldf("select x.rowid x, y.rowid y,
    max(x.B - y.B, 0) B, max(x.C - y.C, 0) C, 
    max(x.D - y.D, 0) D, max(x.E - y.E, 0) E,
    max(x.F - y.F, 0) F, max(x.G - y.G, 0) G, 
    max(x.H - y.H, 0) H, max(x.I - y.I, 0) I
    from df1 x, df1 y
    where x.rowid > y.rowid", dbname = tempfile())
当然,如果它真的这么大,那么你可能也很难对它进行任何后续计算

输出。无论如何,两个备选方案给出的结果如下所示。x和y显示减去了哪些输入行

> DF
  x y B C D E F G H I
1 2 1 0 0 0 0 0 1 0 1
2 3 1 0 0 0 0 1 0 1 0
3 3 2 1 0 1 0 1 0 1 0

注意。尽管这个问题要求优化内存而不是速度,但如果速度是一个问题,那么可以添加索引。

直接使用sqldf包或RSQLite可以在R之外完成所有计算,这样就不需要中间存储。我们使用sqldf进行了说明。有关更多信息,请参阅

在这种方法中的备选方案1注意,我们使用dbname=tempfile,以便它在一个外部数据库中执行所有计算,该数据库会动态创建并自动删除,而不是在内存中执行

library(sqldf)
gc()
DF <- sqldf("select x.rowid x, y.rowid y,
    max(x.B - y.B, 0) B, max(x.C - y.C, 0) C, 
    max(x.D - y.D, 0) D, max(x.E - y.E, 0) E,
    max(x.F - y.F, 0) F, max(x.G - y.G, 0) G, 
    max(x.H - y.H, 0) H, max(x.I - y.I, 0) I
    from df1 x, df1 y
    where x.rowid > y.rowid", dbname = tempfile())
当然,如果它真的这么大,那么你可能也很难对它进行任何后续计算

输出。无论如何,两个备选方案给出的结果如下所示。x和y显示减去了哪些输入行

> DF
  x y B C D E F G H I
1 2 1 0 0 0 0 0 1 0 1
2 3 1 0 0 0 0 1 0 1 0
3 3 2 1 0 1 0 1 0 1 0

注意。虽然问题是优化内存而不是速度,但如果速度是一个问题,可以添加索引。

因为数据是同质的,所以使用矩阵表示法。组织它,使“行”成为列,如图所示

m <- t(as.matrix(df1))
mode(m) <- "integer"  # maybe already true?
最后一步是

ans[ans<0L] <- 0L

因为数据是同质的,所以使用矩阵表示法。组织它,使“行”成为列,如图所示

m <- t(as.matrix(df1))
mode(m) <- "integer"  # maybe already true?
最后一步是

ans[ans<0L] <- 0L

另外,你的数据总是二进制的,即0和1吗?这和相关的Q与你几周前问的Q有什么不同,你的目标是乘法而不是减法?如果你使用内存映射文件,通过bigmemory这样的软件包,你可以使用很少的RAM和巨大的数据集——所有你可以放在HD空间中的东西。我在@Andrie之后重复:data.frame中有多少行和多少列?简单的dimdf1输出。另外,您的数据是否始终是二进制的,即0和1?这和相关的Q与您几周前询问的Q有何不同,您的目标是乘法而不是减法?如果你使用内存映射文件,通过bigmemory这样的软件包,你可以使用很少的RAM和巨大的数据集——所有你可以放在HD空间中的东西。我在@Andrie之后重复:data.frame中有多少行和多少列?简单的dimdf1输出。回答很好-我建议调制解调器谢谢Tommy我按照您的建议更新了代码,并完成了“原始”解决方案的版本。回答很好-我建议调制解调器谢谢Tommy我按照您的建议更新了代码,并完成了“原始”解决方案的版本。