gpt4 book ai didi

R:在可行的情况下进行快速(有条件)子集化

转载 作者:行者123 更新时间:2023-12-04 11:46:48 27 4
gpt4 key购买 nike

我想对我的数据行进行子集化

library(data.table); set.seed(333); n <- 100
dat <- data.table(id=1:n, x=runif(n,100,120), y=runif(n,200,220), z=runif(n,300,320))

> head(dat)
id x y z
1: 1 109.3400 208.6732 308.7595
2: 2 101.6920 201.0989 310.1080
3: 3 119.4697 217.8550 313.9384
4: 4 111.4261 205.2945 317.3651
5: 5 100.4024 212.2826 305.1375
6: 6 114.4711 203.6988 319.4913

在几个阶段。我知道我可以申请 subset(.)依次实现这一点。
> s <- subset(dat, x>119)
> s <- subset(s, y>219)
> subset(s, z>315)
id x y z
1: 55 119.2634 219.0044 315.6556

我的问题是我需要自动执行此操作,并且可能会发生子集为空的情况。在这种情况下,我想跳过导致空集的步骤。例如,如果我的数据是
dat2 <- dat[1:50]
> s <-subset(dat2,x>119)
> s
id x y z
1: 3 119.4697 217.8550 313.9384
2: 50 119.2519 214.2517 318.8567

第二步 subset(s, y>219)会出现空的,但我仍然想应用第三步 subset(s,z>315) .有没有办法仅在导致非空集时应用子集命令?我想像 subset(s, y>219, nonzero=TRUE) .我想避免像这样的结构
s <- dat
if(nrow(subset(s, x>119))>0){s <- subset(s, x>119)}
if(nrow(subset(s, y>219))>0){s <- subset(s, y>219)}
if(nrow(subset(s, z>318))>0){s <- subset(s, z>319)}

因为我担心如果-那么丛林会相当慢,特别是因为我需要使用 lapply(.) 将所有这些应用于列表中的不同 data.tables | .这就是为什么我希望找到针对速度进行优化的解决方案。

附注。我只选了 subset(.)为清楚起见,解决方案例如如果不是更多的话,data.table 也同样受欢迎。

最佳答案

我同意康拉德的回答,即这应该发出警告或至少报告以某种方式发生的事情。这是一种利用索引的 data.table 方式(有关详细信息,请参阅包小插图):

f = function(x, ..., verbose=FALSE){
L = substitute(list(...))[-1]
mon = data.table(cond = as.character(L))[, skip := FALSE]

for (i in seq_along(L)){
d = eval( substitute(x[cond, verbose=v], list(cond = L[[i]], v = verbose)) )
if (nrow(d)){
x = d
} else {
mon[i, skip := TRUE]
}
}
print(mon)
return(x)
}

用法
> f(dat, x > 119, y > 219, y > 1e6)
cond skip
1: x > 119 FALSE
2: y > 219 FALSE
3: y > 1e+06 TRUE
id x y z
1: 55 119.2634 219.0044 315.6556

verbose 选项将打印 data.table 包提供的额外信息,因此您可以查看何时使用索引。例如,使用 f(dat, x == 119, verbose=TRUE) , 我看到了。

because I fear the if-then jungle would be rather slow, especially since I need to apply all of this to different data.tables within a list using lapply(.).



如果是非交互式使用,最好让函数返回 list(mon = mon, x = x)更轻松地跟踪查询是什么以及发生了什么。此外,可以捕获并返回详细的控制台输出。

关于R:在可行的情况下进行快速(有条件)子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57430411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com