【问题标题】:Mutate new character col based on another character col in oracle table using R dbplyr使用 R dbplyr 根据 oracle 表中的另一个字符 col 改变新字符 col
【发布时间】:2019-07-31 14:52:40
【问题描述】:

我有一个oracle 表和一个col COMPLAINT_REASON

complaints_tbl %>% head() %>% select(COMPLAINT_REASON)

# Source:   lazy query [?? x 1]
# Database: Oracle 12.01.0020[user@user_db/]
  COMPLAINT_REASON         
  <chr>                    
1 Payment Related          
2 Bill Related          
3 Order Management          
4 Repair/Connection related
5 Broadband
6 Product fault   

我正在尝试创建一个名为primary_reason 但具有不同值的新列,即如果COMPLAINT_REASON = Payment Related 那么primary_reason 应该有Payments。如果none 匹配,则具有primary_reason 列中的值。

在正常情况下,我会使用data.table

complaints_tbl <- complaints_tbl[,primary_reason := forcats::fct_recode(COMPLAINT_REASON,
    "Payments"    = "Payment Related",
    "Billing"    = "Bill Related",
    "Orders"    = "Order Management",
    "Billing"    = "Billing/Payment Enquiry")]

如您所见,不可用的将按原样归于primary reason。 (Product fault, Broadband, Repair/Connection related)Payment Relatedprimary_reason 中变为 Payments 等。

我试过了:

complaints_tbl %>% mutate(primary_reason = forcats::fct_recode(COMPLAINT_REASON
    "Payments"    = "Payment Related",
    "Billing"    = "Bill Related",
    "Orders"    = "Order Management",
    "Billing"    = "Billing/Payment Enquiry"))

但得到错误:

Error in check_factor(.f) : object 'COMPLAINT_REASON' not found

最后,最好将新的 col 推回到我在 oracle 中的现有表中以供将来使用。

有什么建议吗? 干杯

【问题讨论】:

    标签: r oracle dplyr dbplyr


    【解决方案1】:

    我在 SQL Server 而非 Oracle 中工作,但我认为这里的挑战是确保 dbplyr 可以将您的命令翻译成数据库语言,无论您选择何种语言。

    一般dbplyr 难以翻译dplyrtidyverse 集合之外的命令。因此,为什么 forcats::fct_recode 不适合你。

    使用ifelse 的示例解决方案,在我的环境中可以正确翻译:

    complaints_tbl %>%
      # create column for ease of changes
      mutate(primary_reason = NA) %>%
      # one mutate per match/rename
      mutate(primary_reason = ifelse(COMPLAINT_REASON = "Payment Related",
                                     yes = "Payments", no = primary_reason)) %>%
      mutate(primary_reason = ifelse(COMPLALINT_REASON = "Billing Related",
                                     yes = "Billing", no = primary_reason)) %>%
      # if none are matched
      mutate(primary_reason = ifelse(is.na(primary_reason),
                                     yes = COMPLAINT_REASON, no = primary_reason))
    

    您可以使用case_when,而不是使用ifelse 进行多次变异。

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多