小编Ada*_*dam的帖子

显示R脚本生成的警告

我有一个包含多个块的脚本,其中的行看起来像这样......

#Read data for X
DataX = read.delim(file = 'XRecords.txt',
                   col.names = XFields[,'FieldName'])
print('Data X read')
#Convert fields that should be numeric into numeric so they can summed
DataX[,NumFieldNames] = as.numeric(as.character(XData[,NumFieldNames]))
print('Data X scrubbed')
Run Code Online (Sandbox Code Playgroud)

当我获取脚本时,我得到这样的输出......

[1] "Data X read"
[1] "Data X scrubbed"
[1] "Data Y read"
[1] "Data Y scrubbed"
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)

根据该输出,我重新加载数据Y并开始查找字符串到数字转换失败的记录.经过几个小时的挫折,我意识到数据X实际上是具有类型转换错误的数据.

看起来正在发生的是发出警告,但在脚本完成之前它不会显示在控制台上.有没有办法在警告出现后立即将警告输出到控制台?我尝试了flush.console(),但它似乎不适用于警告.

如果可以避免的话,我宁愿不在我的系统上加载任何额外的软件包.我正在使用它来工作,我不得不跳过几个箍,只是为了在我的电脑上安装CRAN发行版.

谢谢.我很感激帮助.

r

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

在 R 中使用 tryCatch 抑制警告

我想做什么

编写一个tryCatch将处理错误值但将忽略警告的代码。举个例子

foo <- function(x) {
  if (x == 1) {
    warning('Warning')
  } else if (x == 0) {
    stop('Error')
  }
  return(1)
}

bar <- function(x){
  tryCatch(
    expr    = foo(x),
    error   = identity,
    warning = function(w) invokeRestart("muffleWarning")
  )
}
Run Code Online (Sandbox Code Playgroud)

因此foo,如果您传递 0 会警告您,如果您传递 1 则会出现错误。目的bar是如果您传递 0 则会收到错误,但它会抑制bar传递 1 时生成的警告。该invokeRestart("muffleWarning")命令来自的定义suppressWarnings。它在我这里的建筑中不起作用,我不知道为什么。(具有讽刺意味的是,它会生成一个错误,因此尝试成功将我不想要的警告升级为我无法解释的错误。)

我不想使用的愚蠢答案 (TM) 以及为什么

这个定义bar将起作用

bar <- function(x){
  tryCatch(
    expr    = foo(x),
    error   = SomeFunctionThatDoesNotMatter,
    warning = function(w){suppressWarnings(foo(x))}
  ) …
Run Code Online (Sandbox Code Playgroud)

r try-catch suppress-warnings

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

data.table的包装函数

我有一个已经使用data.frame上下文编写的项目.为了改善计算时间,我试图利用data.table的速度来代替.我的方法是构建包装函数,读取框架,将它们转换为表格,进行计算,然后转换回框架.这是一个简单的例子......

FastAgg<-function(x, FUN, aggFields, byFields = NULL, ...){
  require('data.table')
  y<-setDT(x)
  y<-y[,lapply(X=.SD,FUN=FUN,...),.SDcols = aggFields,by=byFields]
  y<-data.frame(y)
  y
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在运行此函数后,x已转换为表格,然后我使用data.frame表示法编写的代码行失败.如何确保运行函数不改变我输入的data.frame?

r data.table

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

如何使用 SQLAlchemy 为 RDS 代理设置 TLS

我有一个 AWS Lambda 函数 (Python3.8),在其中尝试使用 SQLAlchemy 连接到 RDS 代理。我已经确认函数配置将允许使用 PyMySQL 直接连接到代理。当我运行该函数时,我收到一条错误消息“(pymysql.err.InternalError) (3159, '此 RDS 代理需要 TLS 连接')\n(此错误的背景位于:http://sqlalche.me/e /2j85 )”。该错误的“背景”没有提及 TLS。我明白我需要做什么(告诉 SQLAlchemy 使用 SSL/TLS 连接),但我无法弄清楚这样做的语法。下面是我当前的代码。

import pymysql
import sqlalchemy

from database_info import make_connection_str

print('connecting to database')
CONN_STR = make_connection_str()
ENGINE = sqlalchemy.create_engine(CONN_STR)
METADATA = sqlalchemy.MetaData(ENGINE)
TABLE = sqlalchemy.Table('active_prospect', METADATA, autoload=True) #error comes with this line
Run Code Online (Sandbox Code Playgroud)

我尝试过的事情与以下内容有关

基于这两件事,我以两种不同的方式尝试了 (ssl-mode, ssl) = ('true', 'required') 的每种组合。

  • CONN_STR += '?ssl-mode=REQUIRED'
  • create_engine(CONN_STR, connect_args={'ssl': 'True'})

结果各不相同。在某些情况下,上面的错误已被替换AttributeError: 'str' …

mysql sqlalchemy amazon-rds aws-lambda python-3.8

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

R data.table j仅在执行连接时没有时才有效

我会潜入它...

DT_1 <- data.table(pk = c(1,1,2,2), val = 1:4, key = 'pk')
DT_2 <- data.table(pk = 1:2, att = c('a','b'), key = 'pk')
Run Code Online (Sandbox Code Playgroud)

这有效.

> DT_2[i = DT_1, j = `:=`(max_val = max(val))]
> DT_2
   pk att max_val
1:  1   a       4
2:  2   b       4
Run Code Online (Sandbox Code Playgroud)

事实并非如此.

> DT_2[i = DT_1, j = `:=`(max_val = max(val)), by = .(pk)]
Error in `[.data.table`(DT_2, i = DT_1, j = .(max(val)), by = .(pk)) : 
  object 'val' not found
Run Code Online (Sandbox Code Playgroud)

为什么以及如何处理它?

r data.table

5
推荐指数
0
解决办法
90
查看次数

带变量列表的聚合函数

我正在尝试创建一个 R 脚本来汇总数据框中的度量。我希望它对数据框结构的变化做出动态反应。例如,我有以下块。

library(plyr) #loading plyr just to access baseball data frame
MyData <- baseball[,cbind("id","h")]
AggHits <- aggregate(x=MyData$h, by=list(MyData[,"id"]), FUN=sum)
Run Code Online (Sandbox Code Playgroud)

此块创建一个数据框 (AggHits),其中包含每个玩家 (id) 的总点击次数 (h)。好极了。

假设我想带入团队。如何更改 by 参数,以便 AggHits 具有“id”和“team”的每个组合的总点击次数?我尝试了以下操作,第二行抛出错误:参数必须具有相同的长度

MyData <- baseball[,cbind("id","team","h")]
AggHits <- aggregate(x=MyData$h, by=list(MyData[,cbind("id","team")]), FUN=sum)
Run Code Online (Sandbox Code Playgroud)

更一般地说,我想编写第二行,以便它自动按除 h 之外的所有变量聚合 h。我可以很容易地使用 setdiff 生成要分组的变量列表。

# set the list of variables to summarize by as everything except hits
SumOver <- setdiff(colnames(MyData),"h")

# total up all the hits - again this line throws an error
AggHits <- aggregate(x=MyData$h, by=list(MyData[,cbind(SumOver)]), FUN=sum)
Run Code Online (Sandbox Code Playgroud)

我使用它的业务目的涉及一个 csv …

r

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

从R中的先前观察中查找信息

我有一个包含交易的数据表.除其他事项外,交易标记有日期/时间和客户.

library(data.table)
transactions <- data.table(trans.id = 1:10,
                           customer.id = c(rep(c('a','b'),3),'c'))
set.seed(42)
transactions[, time := sample(500, 10, T)]
Run Code Online (Sandbox Code Playgroud)

对于每个交易,我想查找客户的前一个交易,这样我就可以做一些事情,比如计算自上次交易以来的时间.这是我能做的最好的......

Find.Prior.ID <- function(id.curr) {
  trans.curr <- transactions[trans.id == id.curr]
  time.curr <- trans.curr[, time]
  customer <- trans.curr[, customer.id]
  prior.trans <- transactions[
    time < time.curr & customer.id == customer]
  if (dim(prior.trans)[1] == 0) {return(NA)}
  time.prior <- prior.trans[,max(time)]
  id.prior <- prior.trans[
    time == time.prior,
    trans.id]
  return(id.prior)
}

transactions[, prior.id := unlist(lapply(
  X = trans.id, FUN = Find.Prior.ID))]
Run Code Online (Sandbox Code Playgroud)

一旦我prior.id填充了一个简单的合并允许我映射我想要的任何其他信息.我的问题真的归结为运行时间.这种结构具有突出的长时间运行.有没有办法更快地做到这一点?

答案(具体到相关示例)

setorder(transactions, time)
transactions[, …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

data.table环境错误的功能

任何人都可以向我解释为什么bar不起作用?这是一个错误data.table吗?

Circles<-data.table(radius=1:10)

foo<-function(Circ){
  Circ[,diameter:=2*radius]
}
dput(x = foo,file = 'func.R')
bar<-dget(file = 'func.R')

foo(Circles)

bar(Circles)
Run Code Online (Sandbox Code Playgroud)

它与dget函数设置它返回的对象的环境这一事实有关.GlobalEnv.有一个简单易用的工作,但它会让像我这样的新手疯狂地试图弄清楚它为什么会破坏它.

MyDGet<-function(file){
  temp<-dget(file=file)
  environment(temp)<-.GlobalEnv
  return(temp)
}

bar<-MyDGet(file = 'func.R')
Run Code Online (Sandbox Code Playgroud)

r data.table

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