gpt4 book ai didi

r - 如何评估字符串以过滤 R data.table?

转载 作者:行者123 更新时间:2023-12-03 15:25:20 24 4
gpt4 key购买 nike

我希望在将过滤条件字符串传递到 data.table 方面得到一些帮助。我已经尝试了所有的解析和评估方式,但似乎无法弄清楚

我尝试使用 iris 数据集重新创建一个示例:

iris <- data.table(iris)

vars <- 'setosa'
filter <- 'Species == vars & Petal.Length >= 4'

data <- iris[filter,
list(sep.len.tot = sum(Sepal.Length), sep.width.total = sum(Sepal.Width)),
by = 'Species']

所以过滤器字符串中有一个 vars 变量(它根据循环变化)。我正在尝试根据过滤器字符串过滤数据。

是否有一个 data.table 特定的评估字符串的方法?

希望这是有道理的!

最佳答案

我想 eval(parse(text()))会工作,你只需要一些修改。尝试这个:

library(data.table)
iris <- data.table(iris)

#Updated so it will have quotes in your string
vars <- '\"setosa\"'
#Update so you can change your vars
filter <- paste0('Species==',vars,'& Petal.Length >= 4')

res <- iris[eval(parse(text=filter)), list(
sep.len.tot = sum(Sepal.Length)
, sep.width.total = sum(Sepal.Width)
), by = 'Species']

一些注意事项:我更新了你的 vars所以字符串中会有引号,所以它会正常运行,我还更新了 filter以便您可以动态更改 vars .

最后,出于解释的目的,生成的 df 是空白的(因为没有 setosa 物种的 Petal.Length >= 4。所以为了看到这项工作,我们可以删除最后一个条件。
filter <- paste0('Species==',vars)
res2 <- iris[eval(parse(text=filter)), list(
sep.len.tot = sum(Sepal.Length)
, sep.width.total = sum(Sepal.Width)
), by = 'Species']

res2
Species sep.len.tot sep.width.total
1: setosa 250.3 171.4

编辑 :
根据下面@Frank 的评论,更简洁的方法是将整个内容写成一个表达式:
filter <- substitute(Species == vars, list(vars = "setosa"))

res <- iris[eval(filter), list(
sep.len.tot = sum(Sepal.Length)
, sep.width.total = sum(Sepal.Width)
), by = 'Species']

关于r - 如何评估字符串以过滤 R data.table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37841005/

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