我想知道我是否可以使用data.table
. 我有一个数据集,其中包含不同的样本,用于不同的时期(日期)和不同的组(id)。
#the data
require(data.table)
dt <- data.table(id=c(rep(1,50),rep(2,50),rep(1,50),rep(2,50)),date=c(rep("2004-01-01",100),rep("2004-02-01",100)),A=c(rnorm(50,1,3),rnorm(50,2,3),rnorm(50,1,4),rnorm(50,1.5,3)),
B=c(rnorm(50,1.3,2.9),rnorm(50,1.8,3.1),rnorm(50,1.6,4),rnorm(50,1.7,2.4)))
我想应用以下功能。
#the function which should be applied
function(a, ie1, b, a1, ie2, b2, ...) {
ipf <- function(a, b, ...) {
m <- length(a)
n <- length(b)
if (m < n) {
r <- rank(c(a, b), ...)[1:m] - 1:m
} else {
r <- rank(c(a, b), ...)[(m + 1):(m + n)] - 1:n
}
s <- ifelse((n + m)^2 > 2^31, sum(as.double(r)), sum(r))/(as.double(m) * n)
return(ifelse(m < n, s, 1 - s))
}
expand.grid.alt <- function(seq1, seq2) {
cbind(rep.int(seq1, length(seq2)), c(t(matrix(rep.int(seq2, length(seq1)), nrow = length(seq2)))))
}
if (missing(a1) | missing(b2) | missing(ie2)) {
if (ie1 == ">") {
return(ipf(a, b))
} else {
return(ipf(b, a))
}
} else {
if (ie1 == ">") {
if (ie2 == ">") {
return(ipf(a, apply(expand.grid.alt(b, b2), 1, max))/ipf(a1, b2))
} else {
return(1 - ipf(apply(expand.grid.alt(b, b2), 1, min), a)/(1 - ipf(a1, b2)))
}
} else {
if (ie2 == ">") {
return(1 - ipf(a, apply(expand.grid.alt(b, b2), 1, max))/ipf(a1, b2))
} else {
return(ipf(apply(expand.grid.alt(b, b2), 1, min), a)/(1 - ipf(a1, b2)))
}
}
}
}
此功能比较不同的样本;假设我们有三个样本 A、B、C,它允许例如计算样本 A 的抽取大于样本 B 的抽取的概率,因为样本 A 的抽取大于样本 C 的抽取。我想使用 data.tables 以某种方式应用此功能。以下示例应该向您说明我想要做什么:
#example - what I want to do
dt1 <- dt[date=="2004-01-01"]
ow <- dt1[id==1,A]
ot <- dt1[id!=1,A]
cs <- dt1[,B]
ex <- expand.grid(unique(ow),unique(ot),unique(cs))
names(ex) <- c("ow","ot","cs")
sum(ex$ow > ex$ot & ex$ow > ex$cs)/sum(ex$ow > ex$ot)
#check if the result is correct
all.equal(prob(ow,">",cs,ow,">",ot),sum(ex$ow > ex$ot & ex$ow > ex$cs)/sum(ex$ow > ex$ot))
[1] TRUE
我想通过对所有 id 和所有日期使用 data.table 来自动化上述过程。换句话说:我想计算从 id=1 的变量 A 的平局大于从变量 B 的平局的概率,因为从 id=1 的变量 A 的平局大于从 id!=1 的变量的平局(expand.grid 的使用意味着查看所有可能组合的蛮力方法,上面的 prob() 函数使用更优雅的秩和方法)。
这意味着我需要子集中的某种子集。直觉上我玩过类似的东西:
dt[,.SD[,prob(A,">",B,A,">",.SD[!.BY,A]),key=id],key=date]
然而,这种方法会导致错误消息。谁能帮我解决这个问题?任何评论都非常感谢!