我正在尝试在SQL查询中重新创建这个R逻辑,对于我应该如何去做有什么想法吗?感谢任何帮助

l7mqbcuq  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(99)

下面是我尝试使用SQL中的CASE WHEN语句重新创建的R脚本:

dat[ ,X_1_7_Spline := pmax(1,pmin(ifelse(is.na(X),1,X),7))]

看起来这个命令告诉解析器返回包含条件语句的向量的并行最大值,只要变量X的值介于1和某个值的并行最小值与7之间(只要该值不为空)。然后,它似乎将包含这些值的新列联接回原始数据集我在表示SQL查询中的代码“pmax(1,pmin(ifelse(is.na(X),1,X),7))”部分时遇到了一些麻烦,希望您能告诉我如何有效地完成这一任务。
我现在有一些非常补救的东西,我知道这并不能正确地表达上面的声明:

CASE WHEN MAX(IF(ISNOTNULL(X) AND MIN(X)=1 AND MAX(X)=7) then 1 else X end as X_1_7_Spline

任何想法/反馈将非常感谢,因为我仍在努力理解R脚本。提前感谢对这个问题的任何见解。

9jyewag0

9jyewag01#

  • ifelse(is.na(X),1,X)可以翻译成SQL的COALESCE(X, 1);和
  • pminpmax逻辑可以放置在CASE WHEN中(如您开始所述)

也许是这个?

CASE WHEN X < 1 THEN 1
  WHEN X > 7 THEN 7
  ELSE coalesce(X, 1) END as NewX

我们不需要担心coalesceX < 1X > 7的影响,因为null < 1不会解析为true,所以它不接受这种情况。
使用sqldf在R中进行演示:

library(data.table)
dat <- data.table(X = c(-1,5,9,NA))
dat[, X_1_7_Spline := pmax(1,pmin(ifelse(is.na(X),1,X),7)) ]
sqldf::sqldf("select *, (CASE WHEN X < 1 THEN 1 WHEN X > 7 THEN 7 ELSE coalesce(X,1) END) as NewX from dat")
#    X X_1_7_Spline NewX
# 1 -1            1    1
# 2  5            5    5
# 3  9            7    7
# 4 NA            1    1

相关问题