小编Nov*_*rog的帖子

R - readRDS()和load()无法提供与原始数据相同的data.tables

背景

我试图CSVrds文件替换一些输出文件以提高效率.这些是中间文件,将作为其他R脚本的输入.

我开始调查我的脚本何时失败并发现readRDS()并且load()不会返回与data tables原始脚本相同的脚本.这应该发生吗?还是我错过了什么?

示例代码

library( data.table )

aDT <- data.table( a=1:10, b=LETTERS[1:10] )
saveRDS( aDT, file = "aDT.rds")
bDT <- readRDS( file = "aDT.rds" )
identical( aDT, bDT, ignore.environment = T )  # Gives 'False'

aDF <- data.frame( a=1:10, b=LETTERS[1:10] )
saveRDS( aDF, file = "aDF.rds")
bDF <- readRDS( file = "aDF.rds" )
identical( aDF, bDF, ignore.environment = T )  # Gives 'True'

# Using 'save'& 'load' doesn't …
Run Code Online (Sandbox Code Playgroud)

load r save data.table

13
推荐指数
1
解决办法
1285
查看次数

R - 如何根据多个因子在不同的data.table列上运行average和max并返回原始的colnames

我正在将我的R代码从data.frame+ 更改plyrdata.tables,因为我需要一种更快,更有内存效率的方法来处理大数据集.不幸的是,我的R技能非常有限,而且我整天都遇到了问题.如果这里的SO专家可以启发,将不胜感激.

我的目标

  • 基于2个函数(平均值和最大值)在我的data.table中聚合行在所选列上运行(列名通过向量传递),而按列分组也通过向量传递.
  • 生成的DT应包含原始列名称.
  • 应该不会是DT的不必要的复制,以节省内存

我的测试代码

DT = data.table( a=LETTERS[c(1,1,1:4)],b=4:9, c=3:8, d = rnorm(6), 
                 e=LETTERS[c(rep(25,3),rep(26,3))], key="a" )

GrpVar1 <- "a"
GrpVar2 <- "e"
VarToMax <- "b"
VarToAve <- c( "c", "d")
Run Code Online (Sandbox Code Playgroud)

我尝试了什么,但没有为我工作

DT[, list( b=max( b ), c=mean(c), d=mean(d) ), by=c( GrpVar1, GrpVar2 ) ]  
# Hard-code col name - not what I want

DT[, list( max( get(VarToMax) ), mean( get(VarToAve) )), by=c( GrpVar1, GrpVar2 ) ]  
# Col names become …
Run Code Online (Sandbox Code Playgroud)

aggregate r data.table

11
推荐指数
2
解决办法
1753
查看次数

R - 为什么在数据表中添加1列几乎使用的峰值内存增加了一倍?

在得到2位绅士的帮助后,我设法从数据框+ plyr切换到数据表.

情况和我的问题

在我工作的时候,我注意到当我在我的数据集中添加1个新列时,峰值内存使用量几乎翻了一番,从3.5GB增加到6.8GB(根据Windows任务管理器),:=包含~200K行乘2.5K列.

然后我尝试了25M col的200M行,增加了从6GB到7.6GB,之后下降到7.25GB gc().

特别是关于添加新列,Matt Dowle自己在这里提到:

使用:=运算符,您可以:

Add columns by reference
Modify subsets of existing columns by reference, and by group by reference
Delete columns by reference
Run Code Online (Sandbox Code Playgroud)

这些操作都不会复制(可能很大的)data.table,甚至一次也不复制.

问题1:为什么要加入"NAS的一列的DT与2.5K列翻一番如果data.table完全不使用复制的峰值内存?

问题2:当DT为200M x 25时,为什么不会发生加倍?我没有为此包含版画屏幕,但可以随意更改我的代码并尝试.

使用测试代码的内存使用打印屏幕

  1. 清洁重启,RStudio和MS Word打开 - 使用103MB 1.清洁重新启动,打开RStudio和MS Word

  2. Aft运行DT创建代码但在添加列之前 - 使用3.5GB 在此输入图像描述

  3. 添加1列填充NA后,但在使用gc() - 6.8GB之前 在此输入图像描述

  4. 运行gc()后 - 使用3.5GB 在此输入图像描述

测试代码

为了调查,我做了以下测试代码,它们非常模仿我的数据集:

library(data.table)
set.seed(1)

# Credit: Dirk Eddelbuettel's answer in 
# https://stackoverflow.com/questions/14720983/efficiently-generate-a-random-sample-of-times-and-dates-between-two-dates
RandDate <- function(N, st="2000/01/01", et="2014/12/31") { 
  st <- …
Run Code Online (Sandbox Code Playgroud)

memory r large-data data.table

8
推荐指数
1
解决办法
558
查看次数

如何将ggplot直方图x轴间隔映射到固定调色板?

我想我的分层直方图GGPLOT2到固定的时间间隔,并根据颜色他们特定的调色板:'x<4':black; '4<x<6':blue; '6<x<8':yellow; 等等...

我尝试了两种方法,两种方法都不起作用.

参考下面的代码,替代1在NoOfElement跌到一个小数字(例如500)时失败,并且在第一个时间间隔内没有元素'x<4'.然后ggplot2将'black'分配给第一个区间('4<x<6'当size = 500时).但这不是我想要的(见图).

在此输入图像描述

在备选方案2中,我在数据框中创建了另一个变量,并为每个元素分配了颜色.我这样做是基于对以下方案中给出的解决方案的修改:在符号中设置ggplot2中的特定填充颜色.不幸的是,生成的直方图具有由ggplot2随机分配的颜色.

我很困难,真的很感激一些帮助.提前致谢!

示例代码:

library(ggplot2)

NoOfElement <- 5000; MyBreaks <- c(-Inf, seq(4, 16, by=2), Inf)
MyColours <- c("black", "blue", "yellow", "green", "gray", "brown", "purple", "red")

set.seed(2)
c <- data.frame(a=rnorm(NoOfElement, 10, 2), b=rep(NA, NoOfElement))
c$b <- cut(c$a, MyBreaks)

try <- 1  # Allows toggling of alternatives below
if (try==1)
{
  p <- ggplot( c, aes(x=c$a, fill=c$b) ) + geom_histogram( binwidth=0.2 ) + …
Run Code Online (Sandbox Code Playgroud)

r colors histogram ggplot2

5
推荐指数
1
解决办法
2008
查看次数

RSQLite:如何增加列数和参数?

我经常使用具有 >10,000 列的大型 CSV 文件 (>50GB)。我正在考虑将信息读入RSQLite以便我可以轻松进行查询和子集化。

问题

SQLite 在单个 SQL 中限制为 2000 个字段和 999 个主机参数(请参阅SQLite 网站)。根据,有一种方法来改变这些参数的SQLite(即,由再从源代码编译的SQLite)。

如果我使用的是RSQLite包,如何进行上述更改?有趣的是,根据包的更新日志,默认值早在 2011-12-01 的 0.11.0 版本就已经分别增加到 30,000 和 40,000。但是当我使用 10,000 列的数据框进行测试时,RSQLite v2.1.1仍然抛出错误。

我在这里缺少什么?如果我需要重新编译 SQLite 来更改这些值,我该如何RSQLite使用该新版本?

提前致谢!

sqlite r rsqlite

4
推荐指数
1
解决办法
204
查看次数

如何降低gridExtra的grid.arrange中的主标题?

我使用gridExtra的grid.arrange创建了一个图表,并尝试在将整个图表保存到.png文件之前添加一个主标题.

使用main="TITLE"参数可以工作,但它会使用顶部边框刷新,无论我设置图表的高度如何.

我的问题:如何设置它以使主标题不会被顶部边框刷新?一种方法是为整个图表添加一个总体余量,但同样,我无法弄清楚如何.

作为一个例子,我从网格排列中修改了SandyMuspratt和Baptiste的代码,将表格和图形放在一个图像上:

library(ggplot2)
library(gridExtra)

x = read.table(text = "
               1/1/2010 10
               1/2/2010 20
               1/3/2010 15
               1/4/2010 56
               1/5/2010 46
               1/6/2010 15
               1/8/2010 15
               1/9/2010 15
               1/10/2010 20
               1/11/2010 15
               1/12/2010 15
               1/13/2010 40
               1/14/2010 15
               1/15/2010 15
               1/16/2010 70", sep = "", header = FALSE)

p1<-ggplot(x, aes(V2, V1)) + geom_point()
p2<-tableGrob(x)

png( filename = "TEST.png", width = 1700, height = 900, units = "px")
grid.arrange(p2, p1, main=textGrob("Total Data and Image", gp=gpar(cex=3)), …
Run Code Online (Sandbox Code Playgroud)

r margin title gridextra

3
推荐指数
1
解决办法
9338
查看次数

按 id 过滤 Tensorflow 数据集

问题

我正在尝试基于包含我希望子集化的索引的 numpy 数组来过滤 Tensorflow 2.4 数据集。该数据集有 1000 张形状为 (28,28,1) 的图像。

玩具示例代码

m_X_ds = tf.data.Dataset.from_tensor_slices(list(range(1, 21))).shuffle(10, reshuffle_each_iteration=False)
arr = np.array([3, 4, 5])
m_X_ds = tf.gather(m_X_ds, arr)  # This is the offending code
Run Code Online (Sandbox Code Playgroud)

错误信息

ValueError: Attempt to convert a value (<ShuffleDataset shapes: (), types: tf.int32>) with an unsupported type (<class 'tensorflow.python.data.ops.dataset_ops.ShuffleDataset'>) to a Tensor.
Run Code Online (Sandbox Code Playgroud)

迄今为止的研究

我发现了这个这个,但它们是特定于它们的用例的,而我正在寻找一种更通用的子集方法(即基于外部派生的索引数组)。

我对 Tensorflow 数据集非常陌生,迄今为止发现学习曲线相当陡峭。希望能得到一些帮助。提前致谢!

python tensorflow

2
推荐指数
1
解决办法
2369
查看次数

使用speedier hist()或findInterval()获得与cut()相同的输出?

我读了这篇文章http://www.r-bloggers.com/comparing-hist-and-cut-r-functions/,测试hist()速度比cut()我的PC 快了~4倍.我的脚本循环遍历cut()很多次,因此省时很重要.因此我试图切换到更快的功能,但是很难获得准确的输出cut().

从以下示例代码:

data <- rnorm(10, mean=0, sd=1)  #generate data
my_breaks <- seq(-6, 6, by=1)  #create a vector that specifies my break points
cut(data, breaks=my_breaks)
Run Code Online (Sandbox Code Playgroud)

我希望得到一个包含级别的向量,使用我的断点将每个数据元素分配给它,即:的确切输出cut:

 [1] (1,2]   (-1,0]  (0,1]   (1,2]   (0,1]   (-1,0]  (-1,0]  (0,1]   (-2,-1] (0,1]  
Levels: (-6,-5] (-5,-4] (-4,-3] (-3,-2] (-2,-1] (-1,0] (0,1] (1,2] (2,3] (3,4] (4,5] (5,6]
> 
Run Code Online (Sandbox Code Playgroud)

我的问题:我如何使用hist()输出元素(即中断,计数,密度,中等)或findInterval达到我的目标?

另外,我发现从一个例子/sf/ask/866538991/使用findInterval,但是这需要我事先创建的间隔的标签,这是不是我想要的.

任何帮助,将不胜感激.提前致谢!

cut r histogram

1
推荐指数
1
解决办法
1668
查看次数

Python如何打印itertools.permutations的属性

我是Python新手,我正在尝试itertools:

import itertools as it
obj = it.permutations(range(4))
print(obj)
for perm in obj:
    print( perm )
Run Code Online (Sandbox Code Playgroud)

我的问题:如何在不使用循环的情况下obj 直接查看/打印所有排列for

我尝试了什么: 我尝试使用__dict__vars在这个SO链接中建议,但两个都不起作用(前者似乎不存在对象,而后者生成'TypeError:'itertools.permutations'对象不可调用').

请原谅,如果我的问题相当无趣 - 这个属性问题看起来很复杂,大部分用SO链接写的东西飞过我的头脑.

python attributes python-itertools

1
推荐指数
1
解决办法
234
查看次数