小编jan*_*cki的帖子

关于setkey的R data.table 1.9.2问题

这似乎是1.8.10之后引入的与setkey相关的bug,其中DT包含列表.运行以下两个代码来查看问题:

library(data.table)
dtl <- list()
dtl[[1]] <- data.table(scenario = 1,
                       processing = c(function(x) x))
dtl[[2]] <- data.table(scenario = 2,
                       processing = c(function(x) x))
dt <- rbindlist(dtl)
setkeyv(dt, c("scenario"))
Run Code Online (Sandbox Code Playgroud)

第二个,目前产生错误:

dtl <- list()
dtl[[1]] <- data.table(scenario = 2, # <- note we change order
                       processing = c(function(x) x))
dtl[[2]] <- data.table(scenario = 1,
                       processing = c(function(x) x))
dt <- rbindlist(dtl)
setkeyv(dt, c("scenario")) #setkey cannot sort?
Run Code Online (Sandbox Code Playgroud)

它在1.8.10中运行良好.我无法在我的DT上设置密钥,似乎与包含功能列表的DT有关.任何简单的解决方法?我跟踪错误消息到C代码,但不知道如何解决它.

在Windows 64bit上的R 3.0.2 + data.table 1.9.2谢谢

r data.table

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

R parallel:rbind并行分成不同的data.frames

以下代码在Windows和Ubuntu平台上产生不同的结果.据我所知,这是因为处理并行处理的方法不同.

总结:
我不能insert/ rbind数据在Linux上平行(mclapply,mcmapply),而我能做到这一点在Windows上.

感谢@Hong Ooi指出这mclapply在Windows上不起作用,但问题仍然有效.

当然,没有多个插入相同data.frame,每个插入都执行到单独的data.frame中.

library(R6)
library(parallel)

# storage objects generator
cl <- R6Class(
    classname = "cl",
    public = list(
        data = data.frame(NULL),
        initialize = function() invisible(self),
        insert = function(x) self$data <- rbind(self$data, x)
    )
)

N <- 4L # number of entities
i <- setNames(seq_len(N),paste0("n",seq_len(N)))

# random data.frames
set.seed(1)
ldt <- lapply(i, function(i) data.frame(replicate(sample(3:10,1),sample(letters,1e5,rep=TRUE))))

# entity storage
lcl1 <- lapply(i, function(i) cl$new())
lcl2 <- …
Run Code Online (Sandbox Code Playgroud)

parallel-processing r parallel-foreach rparallel r6

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

SQL的`case when when ...使用R中的data.table包进行代码转换

我试图将SQL代码转换为R代码.但是,数据大约有3500万条记录,每条记录有200列.所以我能找到的最佳选择是data.table包.

这是问题所在.在SQL代码中,我能够执行这样的操作,

select order_date,sum(case when item in ("D","C","B") then col4 end)as col1
sum(case when item not in ("Z","X","Y") then col4 end) as col2 
from datatable 
where col3 <25
group by order_date;
Run Code Online (Sandbox Code Playgroud)

以上查询允许我按每个日期分组.我无法在data.table中复制它.我的尝试如下.

grp1<- c("D","C","B")
grp2<- c("Z","X","Y")
d1 <- dat[item %in% grp1,.(col1 = sum(col4,na.rm = TRUE),by = Order_Date]
d2 <- dat[item %in% grp2,.(col2 = sum(col4,na.rm = TRUE),by = Order_Date]
d3 <- data.table(d1,d2)
Run Code Online (Sandbox Code Playgroud)

现在,因为它subsets最初我是分组在不同的两个d1d2

sql r data.table

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

从R代码调用中断

我有一个通用函数来捕获我的包中logR::tryCatch2 定义的所有异常,定义如下:

tryCatch2 <- function(expr){
    V=E=W=M=I=NULL
    e.handler = function(e){
        E <<- e
        NULL
    }
    w.handler = function(w){
        W <<- c(W, list(w))
        invokeRestart("muffleWarning")
    }
    m.handler = function(m){
        attributes(m$call) <- NULL
        M <<- c(M, list(m))
    }
    i.handler = function(i){
        I <<- i
        NULL
    }
    V = suppressMessages(withCallingHandlers(
        tryCatch(expr, error = e.handler, interrupt = i.handler),
        warning = w.handler,
        message = m.handler
    ))
    list(value=V, error=E, warning=W, message=M, interrupt=I)
}
Run Code Online (Sandbox Code Playgroud)

正如您在最后一行中所看到的,它返回一个或多或少自我描述的列表.
tryCatch2通过简单的方式对调用后延迟的异常做出真正的反应!is.null:

f = function(){ warning("warn1"); warning("warn2"); stop("err") }
r …
Run Code Online (Sandbox Code Playgroud)

r try-catch

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

函数调用的参数的基本 R 替换名称

在这个问题的最终目标是构建以下未评估使用呼叫 “的计算上的语言,在那里lista_name50L从参数提供。

list(a_name = 50L)
Run Code Online (Sandbox Code Playgroud)

内部看起来像

str(quote(list(a_name = 50L)))
# language list(a_name = 50L)

str(as.list(quote(list(a_name = 50L))))
#List of 2
# $       : symbol list
# $ a_name: int 50
Run Code Online (Sandbox Code Playgroud)

我将把我的变量放在一个列表中,这样进一步的代码就会更清晰。

params = list(my_fun = as.name("list"), my_name = "a_name", my_value = 50L)

# What I tried so far?

# 1. The first thing that one would try

substitute(my_fun(my_name = my_value),
           params)
#list(my_name = 50L) ## `my_name` was not substituted!

# 2. …
Run Code Online (Sandbox Code Playgroud)

r metaprogramming rlang

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

rmarkdown中的“待办事项”列表

github标记上有一个方便的功能,它可以创建一个漂亮的格式化的TO DO列表,它可以按以下方式使用:

- [ ] my first item in list
- [ ] my second item in list
  - [ ] first sub item in second item in list
- [x] my third item in list, already done
Run Code Online (Sandbox Code Playgroud)

看起来像:

github上的待办事项列表

有类似的东西rmarkdown吗?

r knitr r-markdown

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

在滚动连接上按引用添加列

问题标题中描述了主要问题.直接进入下面的例子.

我有两个数据集:

library(data.table)
dt1 <- data.table(date = as.Date("2015-06-28")+c(0L,3L,5L,7L),
                  key="date")
dt2 <- data.table(date = as.Date("2015-06-30")+c(0:1,4L),
                  val = letters[7:9],
                  dummy = rep(NA,3),
                  key="date")
Run Code Online (Sandbox Code Playgroud)

我希望将valdt2添加到dt1使用滚动连接.
以下语句将产生与预期的类似的输出:

dt2[dt1, roll=TRUE]
#          date val dummy
# 1: 2015-06-28  NA    NA
# 2: 2015-07-01   h    NA
# 3: 2015-07-03   h    NA
# 4: 2015-07-05   i    NA
Run Code Online (Sandbox Code Playgroud)

这个陈述有两个问题:
1.我不想要第 2 dummy
.我想通过引用来做到这一点:

address(dt1)
# [1] "0x3b57540"
address(dt2[dt1, roll=TRUE])
# [1] "0x3b4e1f0"
Run Code Online (Sandbox Code Playgroud)

所以,我在寻找轧参加并通过我引用添加列dt1dt2,预期输出:

#          date val
# 1: …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

将SQL插入脚本转换为CSV格式

我正在寻找一个awk命令或类似工具,将标准格式良好的SQL插入脚本转换为csv文件.
按标准我的意思是任何地方都没有数据库供应商特定的东西
格式良好我指的是sql脚本的每一行都有一个完整的列设置要插入的情况,即使有NULL.插入的字段顺序也是相同的.
示例输入SQL脚本:

INSERT INTO tbl VALUES (1, 'asd', 923123123, 'zx');
INSERT INTO tbl VALUES (1, NULL, 923123123, 'zxz');
INSERT INTO tbl VALUES (3, 'asd3', 923123123, NULL);
Run Code Online (Sandbox Code Playgroud)

可选:

INSERT INTO tbl (colA, colB, colC, colD) VALUES (1, 'asd', 923123123, 'zx');
Run Code Online (Sandbox Code Playgroud)

预期输出应该是csv文件:

1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
Run Code Online (Sandbox Code Playgroud)

寻找性能高效的解决方案.

sql csv awk sed export-to-csv

5
推荐指数
2
解决办法
841
查看次数

根据日期对数据表中的前行进行计数

(很抱歉,如果这里的某些术语不适用,我来自SQL背景,而我只是进入R世界)

我有一个带有一系列按日期排序的条目的数据表。数据表中的字段之一是分组值,一个是时间值。在按组对数据进行排序(或键入键-我是R的新手,但仍然不确定之间的差异)之后,我要计算日期,对于每一行,该组中的行中有多少行在当前行之前(包括在当前时间段内)。

这是我使用Loblolly数据集尝试做的简化示例:

准备示例数据:

library(lubridate)
library(zoo)
library(data.table)
DT = as.data.table(Loblolly)
DT[,rd := Sys.time() + years(age)]
setkey(DT,Seed,rd)
Run Code Online (Sandbox Code Playgroud)

现在,我们有了一个按种子(组)和rd(我的日期列)排序的数据表。我有一个解决方案,它将以10年为间隔产生我的计数值(ct):

DT[,.ct:=mapply(function(x,y) DT[(rd>x-years(10) & rd<=x &Seed==y),.N],DT$rd,DT$Seed)]
Run Code Online (Sandbox Code Playgroud)

这将在此示例数据集中产生所需的结果:

    height age Seed                  rd  ct
 1:   3.93   3  329 2019-03-01 13:38:00   1
 2:   9.34   5  329 2021-03-01 13:38:00   2
 3:  26.08  10  329 2026-03-01 13:38:00   3
 4:  37.79  15  329 2031-03-01 13:38:00   2
 5:  48.31  20  329 2036-03-01 13:38:00   2
 6:  56.43  25  329 2041-03-01 13:38:00   2
 7:   4.12   3  327 2019-03-01 13:38:00   1
 8:   9.92   5 …
Run Code Online (Sandbox Code Playgroud)

r zoo data.table

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

PL/R函数接受两个表作为参数

我很难找到一个可以接受两个postgres表的PL/R函数的例子.PL/R docs没有提供任何这样的例子.
要有一个工作示例,我们可以考虑在R端使用两个postgres表的合并.

在postgres有两张桌子

CREATE TABLE x (a numeric, b text);
CREATE TABLE y (a numeric, d text);
INSERT INTO x VALUES (1, 'a'),(2, 'b');
INSERT INTO y VALUES (2, 'b'),(3, 'c');
Run Code Online (Sandbox Code Playgroud)

我想替换以下查询

SELECT * FROM x INNER JOIN y ON x.a=y.a;
Run Code Online (Sandbox Code Playgroud)

使用R中定义的PL/R函数:

my_function = function(x, y){
    merge(x, y, by = "a")
}
Run Code Online (Sandbox Code Playgroud)

我能够调用PL/R函数,它接受单个表,但不是两个.

postgresql r plpgsql plr

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