这似乎是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谢谢
以下代码在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) 我试图将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最初我是分组在不同的两个d1和d2
我有一个通用函数来捕获我的包中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 “的计算上的语言,在那里list,a_name并50L从参数提供。
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) 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)
看起来像:

有类似的东西rmarkdown吗?
问题标题中描述了主要问题.直接进入下面的例子.
我有两个数据集:
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)
我希望将val列dt2添加到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)
所以,我在寻找轧参加并通过我引用添加列dt1和dt2,预期输出:
# date val
# 1: …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个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背景,而我只是进入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) 我很难找到一个可以接受两个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函数,它接受单个表,但不是两个.