【问题标题】:R equivalent of case when in SQL?R 相当于 SQL 中的情况?
【发布时间】:2019-11-14 01:37:19
【问题描述】:

我使用 T-SQL 已经有一段时间了,但我现在必须过渡到 R...

select case when date_column_1 < '20160801' then date_column_1 else '20160801' end as date_column_1, case when date_column_2 < '99991231' then '20190701' else date_column_2 end as date_column_2 from table

另外,提前对我糟糕的 stackoverflow 格式化技巧表示歉意。

【问题讨论】:

  • ?pmin 用于与pmin('20160801', c('20160701','20160801','20160901')) 相关的并行最小声音。

标签: sql r case case-when


【解决方案1】:

由于每列只有一个条件要检查,我们可以在这里使用ifelse。如果有多个条件,您可以从dplyr 中检查case_when

transform(table, date_column_1 = ifelse(date_column_1 < as.Date('2016-08-01'), 
                                        date_column_1, as.Date('2016-08-01')), 
                 date_column_2 = ifelse(date_column_2 < as.Date('9999-12-31'),
                                        as.Date('2019-07-01'), date_column_2))

假设 date_column_1date_column_2 属于 Date 类,您不能直接将日期与 R 中的文字字符串 ("20160801") 进行比较,因此我们也将日期转换为 Date 类进行比较。此外,对于date_column_2,您的意思是用日期"2019-07-01" 替换所有值吗?


正如@G 所提到的。 Grothendieck ifelse 会将日期转换为数字。我们可以使用来自dplyrif_else,这是类型严格的,并且会保留日期。

library(dplyr)

table %>%
   mutate(date_column_1 = if_else(date_column_1 < as.Date('2016-08-01'), 
                            date_column_1, as.Date('2016-08-01')), 
          date_column_2 = if_else(date_column_2 < as.Date('9999-12-31'),
                            as.Date('2019-07-01'), date_column_2)))

【讨论】:

  • @G.Grothendieck 谢谢。用if_else更新了答案。
猜你喜欢
  • 1970-01-01
  • 2014-04-24
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2019-07-14
  • 2012-05-27
  • 2019-09-08
相关资源
最近更新 更多