背景
我试图CSV用rds文件替换一些输出文件以提高效率.这些是中间文件,将作为其他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) 我正在将我的R代码从data.frame+ 更改plyr为data.tables,因为我需要一种更快,更有内存效率的方法来处理大数据集.不幸的是,我的R技能非常有限,而且我整天都遇到了问题.如果这里的SO专家可以启发,将不胜感激.
我的目标
我的测试代码
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) 在得到2位绅士的帮助后,我设法从数据框+ plyr切换到数据表.
情况和我的问题
在我工作的时候,我注意到当我在我的数据集中添加1个新列时,峰值内存使用量几乎翻了一番,从3.5GB增加到6.8GB(根据Windows任务管理器),:=包含~200K行乘2.5K列.
然后我尝试了25M col的200M行,增加了从6GB到7.6GB,之后下降到7.25GB gc().
特别是关于添加新列,Matt Dowle自己在这里提到:
使用:=运算符,您可以:
Run Code Online (Sandbox Code Playgroud)Add columns by reference Modify subsets of existing columns by reference, and by group by reference Delete columns by reference这些操作都不会复制(可能很大的)data.table,甚至一次也不复制.
问题1:为什么要加入"NAS的一列的DT与2.5K列翻一番如果data.table完全不使用复制的峰值内存?
问题2:当DT为200M x 25时,为什么不会发生加倍?我没有为此包含版画屏幕,但可以随意更改我的代码并尝试.
使用测试代码的内存使用打印屏幕
清洁重启,RStudio和MS Word打开 - 使用103MB

Aft运行DT创建代码但在添加列之前 - 使用3.5GB

添加1列填充NA后,但在使用gc() - 6.8GB之前

运行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) 我想我的分层直方图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) 我经常使用具有 >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使用该新版本?
提前致谢!
我使用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) 问题
我正在尝试基于包含我希望子集化的索引的 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 数据集非常陌生,迄今为止发现学习曲线相当陡峭。希望能得到一些帮助。提前致谢!
我读了这篇文章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,但是这需要我事先创建的间隔的标签,这是不是我想要的.
任何帮助,将不胜感激.提前致谢!
我是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链接写的东西飞过我的头脑.
r ×7
data.table ×3
histogram ×2
python ×2
aggregate ×1
attributes ×1
colors ×1
cut ×1
ggplot2 ×1
gridextra ×1
large-data ×1
load ×1
margin ×1
memory ×1
rsqlite ×1
save ×1
sqlite ×1
tensorflow ×1
title ×1