是否有一种灵活的方式来连接R中的数据表,其中时间的关键值接近,但不完全相同?例如,假设我有一个为不同时间段提供的结果数据表:
DT1 = data.table(x=rep(c("a","b","c"),each=3), time=c(10,30,60), v=1:9)
Run Code Online (Sandbox Code Playgroud)
在这里,我们对不同时间(时间)采用的不同类别(x)有一些值(v).现在假设我有来自另一个源的数据,它为不同的类别提供了一些时间值:
DT2=data.table(x=rep(c("a","b","c"),each=1),time=c(10,10,60))
Run Code Online (Sandbox Code Playgroud)
我可能有兴趣尝试尽可能地将DT2中的时间与DT1匹配,以预测我的DT2类别的值v.我想做点什么
setkeyv(DT2,c("x","time"))
merge(DT1,DT2,by=c("time","v")
Run Code Online (Sandbox Code Playgroud)
哪个回报:
time x v
1: 10 a 1
2: 10 b 4
3: 60 c 9
Run Code Online (Sandbox Code Playgroud)
但是,如果我的时代没有相同的精度怎么办?例如:
DT2=data.table(x=rep(c("a","b","c"),each=1),time=c(17,54,3))
Run Code Online (Sandbox Code Playgroud)
有没有办法执行类似的合并,但选择接近DT1的DT2时间?那是17接近30,54接近60,接近10接近3?
如果这个简单的例子不清楚,我将简要解释一下我遇到的更大的问题.我有一个包含列的数据表:category,time,output1,output2 ......有数百个类别和关联时间.我可能想在特定时间为所有类别提取输出1.由于时间采样没有明显的逻辑,有时时间四舍五入到最接近的偶数秒; 在其他情况下,时间四舍五入到最接近的分钟甚至10分钟.
我可以编写一个脚本以更常见的格式重写时间,但我很好奇是否有一个我没见过的灵活的data.table解决方案.我已经探索了滚动合并没有成功.
我有一个data.frame,其中包含文件名的文本列.我想返回没有路径或文件扩展名的文件名.通常,我的文件名已经编号,但它们不一定是.例如:
df<-data.frame(data=c("a","b"),fileNames=c("C:/a/bb/ccc/NAME1.ext","C:/a/bb/ccc/d D2/name2.ext"))
Run Code Online (Sandbox Code Playgroud)
我想返回相当于
df<-data.frame(data=c("a","b"),fileNames=c("NAME","name"))
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚用gsub做这个光滑的正则表达式.例如,我可以摆脱扩展名(假设文件名以数字结尾):
gsub('([0-9]).ext','',df[,"fileNames"])
Run Code Online (Sandbox Code Playgroud)
虽然我一直在尝试各种模式(通过阅读此站点上的正则表达式帮助文件和类似的解决方案),我无法获得正则表达式返回最后一个"/"和第一个"."之间的文本.对类似问题的任何想法或转发都非常感谢!
我得到的最好的是:
gsub('*[[:graph:]_]/|*[[:graph:]_].ext','',df[,"fileNames"])
Run Code Online (Sandbox Code Playgroud)
但是这1)没有摆脱所有的前导路径字符和2)依赖于特定的文件扩展名.
在一台运行R 2.15.2的计算机上,我已经安装了.zip文件中的软件包(这些软件包恰好是ggplot2和data.table,但我认为具体的软件包不是我的问题.)一切正常.我将这些包带到没有互联网连接的计算机上并安装它们.另一台计算机正在运行R 3.0.1.这些软件包在安装时似乎没有问题(使用R的"从本地zip文件安装软件包"选项).当我用库()调用包时,我收到以下错误:
错误:包''在3.0.0之前构建:请重新安装它
任何人都可以解释引发此错误的潜在原因吗?是否有特定的目录,.zip包必须正确安装?如果R安装在与.zip软件包加载的单独分区上,是否会导致错误?我很茫然,任何指针都非常感激.这是一个很难再现的; 如果您需要任何其他版本/系统参数来了解问题,请不要犹豫.
我在这里找到了一个使用ggplot和ddply绘制凸包形状的好例子:使用ggplot 绘制多个geom_point组周围的轮廓线
我以为我会尝试类似的东西 - 创建类似Ashby Diagram的东西 - 用data.table包练习:
test<-function()
{
library(data.table)
library(ggplot2)
set.seed(1)
Run Code Online (Sandbox Code Playgroud)
在这里我定义一个简单的表:
dt<-data.table(xdata=runif(15),ydata=runif(15),level=rep(c("a","b","c"),each=5),key="level")
Run Code Online (Sandbox Code Playgroud)
然后我按级别定义船体位置:
hulls<-dt[,as.integer(chull(.SD)),by=level]
setnames(hulls,"V1","hcol")
Run Code Online (Sandbox Code Playgroud)
所以我的想法是将船体与dt合并,这样我最终可以操纵船体以获得ggplot的正确形式(如下所示):
ashby<-ggplot(dt,aes(x=xdata,y=ydata,color=level))+
geom_point()+
geom_line()+
geom_polygon(data=hulls,aes(fill=level))
}
Run Code Online (Sandbox Code Playgroud)
但似乎我尝试合并外壳和dt的任何方式,我得到一个错误.例如,merge(hulls,dt)产生错误,如脚注1所示.
这似乎应该很简单,我确信我只是遗漏了一些明显的东西.任何关于类似帖子的方向或关于如何为ggplot准备船体的想法都非常感谢.或者如果您认为最好坚持采用ddply方法,请告诉我.
不需要的输出示例:
test<-function(){
library(data.table)
library(ggplot2)
dt<-data.table(xdata=runif(15),ydata=runif(15),level=rep(c("a","b","c"),each=5),key="level")
set.seed(1)
hulls<-dt[,as.integer(chull(.SD)),by=level]
setnames(hulls,"V1","hcol")
setkey(dt, 'level') #setting the key seems unneeded
setkey(hulls, 'level')
hulls<-hulls[dt, allow.cartesian = TRUE]
ggplot(dt,aes(x=xdata,y=ydata,color=level))+
geom_point()+
geom_polygon(data=hulls,aes(fill=level))
}
Run Code Online (Sandbox Code Playgroud)
导致一堆乱七八糟的多边形:

脚注1:
vecseq中的错误(f __,len __,if(allow.cartesian)其他为as.integer(max(nrow(x),: Join结果为60行;超过15 = max(nrow(x),nrow(i))检查i中的重复键值,每个键值一遍又一遍地连接到x中的同一组.如果没关系,尝试包含
j并删除by(by-without-by),以便为每个组运行j以避免大如果您确定要继续,请使用allow.cartesian = TRUE重新运行.否则,请在FAQ,Wiki,Stack Overflow和datatable-help中搜索此错误消息以获取建议.
我创建了一个函数,调用它来读入然后返回一个data.table:
read.in.data <- function(filename)
{
library(data.table)
data.holder<-read.table(filename, skip=1)
return(data.table(data.holder))
}
Run Code Online (Sandbox Code Playgroud)
我注意到从观察我的RAM作为函数进程,R似乎分两步处理它(或者至少这是我对正在发生的事情的最佳猜测).例如,当我加载一个1.5 GB的文件(15列,每行总共136个字符)时,R似乎1)读入数据并使用1.5 GB的RAM,然后2)使用另一个1.5 GB的RAM回报.
是否有一些技巧来创建一个函数来创建data.table(或data.frame)并返回data.table而不需要在内存中重复?或者我必须对创建表的函数中的data.table进行所有处理吗?
观察:如果我连续两次运行此代码,则不清除内存; 因为我只有8 GB的RAM,所以功能失败了.如果我跳过在变量中存储"read.table"的步骤(如下所示),我没有任何好处.我不想以任何方式这样做,因为我希望能够在返回之前清理data.table.修复我的问题也可以让我处理更大的文件,而不会耗尽内存.
short.read.trk <- function(fntrk)
{
library(data.table)
return(data.table(read.table(fntrk, skip=1)))
}
Run Code Online (Sandbox Code Playgroud) 我想在matplotlib stackplot的区域内生成标签。我会为标记用于限制区域的线而满意。考虑示例:
import numpy as np
from matplotlib import pyplot as plt
fnx = lambda : np.random.randint(5, 50, 10)
x = np.arange(10)
y1, y2, y3 = fnx(), fnx(), fnx()
areaLabels=['area1','area2','area3']
fig, ax = plt.subplots()
ax.stackplot(x, y1, y2, y3)
plt.show()
Run Code Online (Sandbox Code Playgroud)
但是我想产生这样的东西:
matplotlib等高线图具有这种标记功能(尽管在等高线图中标记线)。
任何帮助(甚至重定向到我可能错过的帖子)都将受到赞赏。
我想在ggplot2生成的图上添加次要网格线到分类数据.例如,
library("ggplot2")
data<-data.frame(xcategory=rep(c("a","b","c"),each=30), yvalue=c(1,3,6))
ggplot(data,aes(x=xcategory,y=yvalue,alpha=1.0,size=5))+
geom_point(position=position_jitter(width=0.1,height=0.0))+
theme_bw()+
scale_x_discrete(name="Categorical Data") +
scale_y_continuous(name="Continuous Response",limits=c(0,7)) +
theme(axis.text.x=element_text(angle = 90),legend.position="none")
Run Code Online (Sandbox Code Playgroud)
生成以下图表:

但我想要的是分类网格线绑定类别名称,以便我可以抖动网格线内的所有数据.这是一个油漆的例子,我用红色编辑了:

界限为"b"的红线可能就是我需要的所有东西,我只想说明三根相等宽度的列.
非常感谢帮助或指导我错过的类似问题.我试过通过"主题"添加网格信息但没有成功.
我正在尝试使用散景的 from_networkx 函数和 nx.spring_layout 参数绘制带有散景的 networkx 图。我正在尝试尽可能多地在 Pandas 数据框中定义我的图形及其属性。我想初始化我的节点的位置;我如何将这些位置传递给 spring_layout?(如果它被传递到 nx.spring_layout(...),我没有得到正确的格式。)任何方向都会有帮助。
换句话说,对于 bokeh.from_networkx(G, networkx.spring_layout...),如何像不使用散景时一样将参数传递给 spring_layout(例如,networkx.spring_layout(G, dim=2, k=None, pos=无...))
简单的例子:
import networkx as nx
import pandas as pd
from bokeh.models import Plot, ColumnDataSource, Range1d, from_networkx, Circle,MultiLine
from bokeh.io import show, output_file
from bokeh.palettes import Viridis
#define graph
source = ['A', 'A', 'A','a','B','B','B','b']
target = ['a', 'B','b','b','a','b','A','a']
weight = [1,-1000,1,1,1,1, -1000, 1]
df = pd.DataFrame([source,target,weight])
df = df.transpose()
df.columns = ['source','target','weight']
G=nx.from_pandas_dataframe(df, 'source', 'target', ['weight'])
#set node attributes
node_color = {'A':Viridis[10][0], 'B':Viridis[10][9],'a':Viridis[10][4],'b':Viridis[10][4]} …Run Code Online (Sandbox Code Playgroud) On my windows 11 home system, running docker desktop v4.15.0, engine 20.10.21, I can run >docker buildx ls to get the expected platforms output (following the docs: https://docs.docker.com/engine/reference/commandline/buildx_ls/):
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default * docker
default default running 20.10.21 linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
desktop-linux docker
desktop-linux desktop-linux running 20.10.21 linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
Run Code Online (Sandbox Code Playgroud)
But continuing with the docs (https://docs.docker.com/engine/reference/commandline/buildx_create/), when running docker buildx create --name mybuilder mybuilder, …
我有许多数据集作为函数的输入.数据存储在数据表中,我正在计算函数输出的置信区间.但是,在某些情况下,所有输入数据都相同,导致错误:"x的所有值都等于100 \n无法计算置信区间"如何避免此错误(例如,只需设置置信区间在所有值相等的情况下,为0或NA等任意值?例如:
library(boot)
library(data.table)
problem=1
data<-data.table(column1=c(1:100),column2=c(rep(100,99),problem))
resample.number=1000
confidence=0.95
sample.mean<-function(indata,x){mean(indata[x])}
boot_obj<-lapply(data,boot,statistic = sample.mean,R = resample.number)
boot.mean.f<-function(x,column){
x[column][1]
}
means<-data.table(sapply(boot_obj,boot.mean.f))
bootci_obj<-lapply(boot_obj,boot.ci, conf = confidence, type = "perc")
bootci.f<-function(x,column){
x<-x[column][4]
x<-unlist(strsplit(as.character(x[1]),","))
x<-sub("[:punct:].*","",x)
x<-sub("lis.*","",x)
x<-sub(").?","",x)
x<-na.omit(as.numeric(x))
}
cis<-data.table(t(sapply(bootci_obj,bootci.f)))
setnames(means,"V1","stat")
cis[,V1:=NULL]
cis[,V2:=NULL]
setnames(cis,c("V3","V4"),c("lci","uci"))
return(cbind(means,cis))
Run Code Online (Sandbox Code Playgroud)
收益:
stat lci uci
1: 50.5 44.96025 56.26797
2: 99.01 97.03000 100.00000
Run Code Online (Sandbox Code Playgroud)
更改
problem=1
Run Code Online (Sandbox Code Playgroud)
返回:"t的所有值都等于100 \n无法计算置信区间",这会导致其他错误.
我希望结果如下:
stat lci uci
1: 50.5 44.96025 56.26797
2: 100.0 0.0000 0.00000
Run Code Online (Sandbox Code Playgroud)
帮助/想法非常感谢!
我使用基本data.table中的信息从其他data.tables中提取数据,如下例所示:
test <- function() {
library(data.table)
test.dt <- data.table(id=c("abc","xyz","ijk"),type=c("1","1","0"),line.position=1:3)
counts.dt <- data.table(
abc=c(10,NA,NA,NA),xyz=c(20,30,NA,NA),ijk=c(10,10,10,10),X2abc=NA,X3abc=1:4)
print(test.dt)
print(counts.dt)
test.dt[,count:=sum(!is.na(counts.dt[[id]])),by=id]
test.dt[,count.value:=counts.dt[line.position,id,with=FALSE],by=id]
print(test.dt)
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,并返回预期的结果:从test.dt中的一行拉取使用(line.position,id)的列来获取计数值(line.position,id).
但是,我不能用一个从工作表中提取数据的更复杂的例子重复这一点.我得到错误:Math.factor(j)中的错误:abs对因素没有意义.在最后一个print语句之前抛出此错误.
test2 <- function(
file.directory="C:/Users/csnyder/Desktop/BootMethod/",
file.name="test.xlsx",
resample.number=3
)
{
require("PBSmapping")
require("xlsx")
library(data.table)
#Load input sheets
file.path<-sprintf("%s%s",file.directory,file.name)
excel.data<-read.xlsx(file.path,sheetIndex=1,header=TRUE,stringsAsFactors=TRUE)
data.DT<-data.table(excel.data)
excel.data<-read.xlsx(file.path,sheetIndex=2,header=TRUE,stringsAsFactors=TRUE)
base.DT<-data.table(excel.data)
excel.data<-read.xlsx(file.path,sheetIndex=3,header=TRUE,stringsAsFactors=TRUE)
related.DT<-data.table(excel.data)
excel.data<-NULL
#add max rows to each ID type. with=TRUE, colnames used as variables.
#get.text<-function(x){return(as.character(x))}
base.DT<-base.DT[,Max.Sample:= sum(!is.na(data.DT[[ID]]),na.rm=TRUE),by=ID]
base.length<-nrow(base.DT)
base.DT[,Sub.Number:=1:base.length]
base.DT[,Resample:=1]
resample.base.DT<-base.DT
#Add line numbers to data tables.
data.DT[,Line:=1:nrow(data.DT)]
related.DT[,Line:=1:nrow(related.DT)]
#resample number added to base DT, then will make a …Run Code Online (Sandbox Code Playgroud)