在R中,我有一个大的data.table.对于每一行,我想计算具有类似值x1(+/-一些容差,tol)的行.我可以使用adply来使用它,但它太慢了.似乎data.table有点好处 - 事实上,我已经在使用data.table进行部分计算了.
有没有办法完全使用data.table?这是一个例子:
library(data.table)
library(plyr)
my.df = data.table(x1 = 1:1000,
x2 = 4:1003)
tol = 3
adply(my.df, 1, function(df) my.df[x1 > (df$x1 - tol) & x1 < (df$x1 + tol), .N])
Run Code Online (Sandbox Code Playgroud)
结果:
x1 x2 V1
1: 1 4 3
2: 2 5 4
3: 3 6 5
4: 4 7 5
5: 5 8 5
---
996: 996 999 5
997: 997 1000 5
998: 998 1001 5
999: 999 1002 4
1000: 1000 1003 3
Run Code Online (Sandbox Code Playgroud)
这是一个与我的真实数据更接近的示例数据集:
set.seed(10) …Run Code Online (Sandbox Code Playgroud) 我有一个非常大的表(目前有5500万行,可能更多),我需要选择它的子集并对这些子集执行非常简单的操作,很多次.看起来像pandas可能是在python中执行此操作的最佳方式,但我遇到了优化问题.
我试图创建一个与我的真实数据集紧密匹配的虚假数据集(尽管它小了~5-10倍).这仍然很大,需要大量内存等等.我正在查询有四列,以及我用于计算的两列.
import pandas
import numpy as np
import timeit
n=10000000
mdt = pandas.DataFrame()
mdt['A'] = np.random.choice(range(10000,45000,1000), n)
mdt['B'] = np.random.choice(range(10,400), n)
mdt['C'] = np.random.choice(range(1,150), n)
mdt['D'] = np.random.choice(range(10000,45000), n)
mdt['x'] = np.random.choice(range(400), n)
mdt['y'] = np.random.choice(range(25), n)
test_A = 25000
test_B = 25
test_C = 40
test_D = 35000
eps_A = 5000
eps_B = 5
eps_C = 5
eps_D = 5000
f1 = lambda : mdt.query('@test_A-@eps_A <= A <= @test_A+@eps_A & ' +
'@test_B-@eps_B <= B <= @test_B+@eps_B & …Run Code Online (Sandbox Code Playgroud) 我正在尝试将alpha和填充ggplot2结合起来.当我使用geom_bar(或geom_points,用于颜色)时它可以工作,但是当我使用geom_boxplot时,alpha图例不起作用.
library(data.table)
library(ggplot2)
dt = data.table(x = rep(1:5,6), y = rnorm(30), tag1 = rep(c('hey', 'what'), 15), tag2 = rep(c('yeah', 'yeah', 'so', 'so', 'so'), 6))
Run Code Online (Sandbox Code Playgroud)
它适用于酒吧:
ggplot(dt[, list(y=mean(y)), by=list(x, tag1, tag2)], aes(x=x, y=y, fill=tag1, alpha=tag2, group=interaction(x,tag1,tag2))) + geom_bar(stat = 'identity', position = 'dodge')
Run Code Online (Sandbox Code Playgroud)
但不是boxplot - alpha图例是空的.
ggplot(dt, aes(x=x, y=y, fill=tag1, alpha=tag2, group=interaction(x,tag1,tag2))) + geom_boxplot()
Run Code Online (Sandbox Code Playgroud)
更简单的版本可以在没有填充的情况下完成 - 看起来条形图默认为灰色/浅灰色,而boxplot默认为白色/浅白色:
ggplot(dt[, list(y=mean(y)), by=list(x, tag2)], aes(x=x, y=y, alpha=tag2, group=interaction(x,tag2))) + geom_bar(stat = 'identity')
Run Code Online (Sandbox Code Playgroud)
ggplot(dt, aes(x=x, y=y, alpha=tag2, group=interaction(x,tag2))) + geom_boxplot()
Run Code Online (Sandbox Code Playgroud)
但我真的不确定如何解决这个问题..有什么想法吗?
我有一个非常大的数据库 - 我正在使用一个350米行的子集,但最终它将是大约3b行.我的全部目标是在这个数据库上优化特定类型的查询,但代价是除了内存以外的所有内容.我正在使用的db文件在PyTables版本2.3.1上使用blosc在1级压缩(我可以更新,如果这会有帮助的话).每行有十三个条目 - 典型条目如下所示:
['179', '0', '1', '51865852', '51908076', '42224', '22', '2', '20', '22', '2', '0.0516910530103', '0.0511359922511']
Run Code Online (Sandbox Code Playgroud)
它们都是数字的,但不一定是同一类型.我目前正在将它们存储在PyTables表中,具有以下定义:
ind = tables.UInt16Col(pos=0)
hap = tables.UInt8Col(pos=1)
chrom = tables.UInt8Col(pos=2)
hap_start = tables.Int32Col(pos=3)
hap_end = tables.Int32Col(pos=4)
hap_len = tables.Int16Col(pos=5)
mh_sites = tables.Int16Col(pos=6)
mh_alt = tables.Int16Col(pos=7)
mh_n_ref = tables.Int16Col(pos=8)
all_sites = tables.Int16Col(pos=9)
all_alt = tables.Int16Col(pos=10)
freq = tables.Float32Col(pos=11)
std_dev = tables.Float32Col(pos=12)
Run Code Online (Sandbox Code Playgroud)
我真的不在乎设置这个数据库需要多长时间 - 我最终会创建它一次然后只是访问它.我的查询形式如下:
a = [ x[:] for x in hap_table.where('''(mh_sites == 15) & (hap_len > 25000) & (hap_len < 30000) & …Run Code Online (Sandbox Code Playgroud)