小编Doc*_*ada的帖子

加入R data.tables,其中键值不完全相等 - 将行与最接近的时间组合

是否有一种灵活的方式来连接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解决方案.我已经探索了滚动合并没有成功.

time r data.table

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

正则表达式返回文件名,删除路径和文件扩展名

我有一个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)依赖于特定的文件扩展名.

regex r gsub

16
推荐指数
2
解决办法
2万
查看次数

"错误:包'_____'的原因是在3.0.0之前构建的:请在R中重新安装它"

在一台运行R 2.15.2的计算机上,我已经安装了.zip文件中的软件包(这些软件包恰好是ggplot2和data.table,但我认为具体的软件包不是我的问题.)一切正常.我将这些包带到没有互联网连接的计算机上并安装它们.另一台计算机正在运行R 3.0.1.这些软件包在安装时似乎没有问题(使用R的"从本地zip文件安装软件包"选项).当我用库()调用包时,我收到以下错误:

错误:包''在3.0.0之前构建:请重新安装它

任何人都可以解释引发此错误的潜在原因吗?是否有特定的目录,.zip包必须正确安装?如果R安装在与.zip软件包加载的单独分区上,是否会导致错误?我很茫然,任何指针都非常感激.这是一个很难再现的; 如果您需要任何其他版本/系统参数来了解问题,请不要犹豫.

install r build package

16
推荐指数
2
解决办法
2万
查看次数

使用R中的data.tables的凸壳ggplot

我在这里找到了一个使用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中搜索此错误消息以获取建议.

merge r convex-hull ggplot2 data.table

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

在R中返回data.table或data.frame时,可以避免重复内存分配?

我创建了一个函数,调用它来读入然后返回一个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)

memory-management r return data.table

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

Python Matplotlib Stackplot中的标签区域

我想在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等高线图具有这种标记功能(尽管在等高线图中标记线)。

任何帮助(甚至重定向到我可能错过的帖子)都将受到赞赏。

python plot matplotlib stacked-area-chart stacked-chart

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

在ggplot2中为分类数据创建次要网格线

我想在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"的红线可能就是我需要的所有东西,我只想说明三根相等宽度的列.

非常感谢帮助或指导我错过的类似问题.我试过通过"主题"添加网格信息但没有成功.

themes r gridlines ggplot2

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

Python 如何通过 Bokeh 的 from_networkx 传递 networkx 布局参数

我正在尝试使用散景的 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)

python networkx bokeh

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

windows 11 home: docker buildx, failed to initilize builder, error during connect, no such host

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, …

docker buildx

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

当采样集中的所有值相等时,避免R boot.ci函数中的错误

我有许多数据集作为函数的输入.数据存储在数据表中,我正在计算函数输出的置信区间.但是,在某些情况下,所有输入数据都相同,导致错误:"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)

帮助/想法非常感谢!

boot r confidence-interval

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

使用从R中的.xlsx import创建的data.table时出现Math.factor(j)错误

我使用基本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)

r xlsx data.table

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