【问题标题】:R - dplyr merge in user-defined function [duplicate]R-用户定义函数中的dplyr合并[重复]
【发布时间】:2019-04-05 16:12:37
【问题描述】:

我正在尝试创建如下合并函数:

定义函数

merge_tables <- function(inputdata1, inputdata2, byvar1, byvar2) {
  
byvar1 <- enquo(byvar1)
byvar2 <- enquo(byvar2)
  
  outputdata <- inputdata1 %>% 
    full_join(inputdata2, by = c(rlang::quo_text(byvar1) = rlang::quo_text(byvar2)))
  
  return(outputdata)
}

使用以下数据和代码运行时出现错误:

模拟数据

set.seed(1)
data1<- data.frame(ID = sample(1:2), letter1 = sample(letters, 2, replace = TRUE))
data2<- data.frame(PatID = sample(1:3), letter2 = sample(letters, 3, replace = TRUE))

使用定义函数的代码

testing_merge <- merge_tables(data1, data2, ID, PatID)

错误信息

Error: unexpected '=' in:
"  outputdata <- inputdata1 %>% 
    full_join(inputdata2, by = c( (rlang::quo_text(byvar1)) ="
>   
>   return(outputdata)
Error: object 'outputdata' not found
> }
Error: unexpected '}' in "}"

我想知道是否有人能看到任何明显的问题?...非常感谢。

【问题讨论】:

    标签: r merge dplyr user-defined-functions


    【解决方案1】:

    这应该可行:

    merge_tables <- function(inputdata1, inputdata2, byvar1, byvar2) {
    
      byvar1 <- enquo(byvar1)
      byvar2 <- enquo(byvar2)
    
      by <- setNames(quo_name(byvar2), quo_name(byvar1))
    
      outputdata <- full_join(inputdata1, inputdata2, by = by)
    
      return(outputdata)
    
    }
    

    返回:

    testing_merge <- merge_tables(data1, data2, ID, PatID)
    
    testing_merge
    
      ID letter1 letter2
    1  1       o       r
    2  2       x       q
    3  3    <NA>       b
    

    【讨论】:

    • 太棒了,谢谢!
    • 我有一个问题,排序是否有原因:setNames(quo_name(byvar2), quo_name(byvar1))。 byvar1 不应该排在第一位吗?
    • 这是由于setNames 的性质,其中简单的对象先出现,然后命名,即(object = nm)。这可能会令人困惑,但这是正确的方法 - 我确信将它们反转会引发错误。
    • 确实,感谢您的澄清。
    • 这对我不起作用 AÑO))
    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 2020-11-04
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    相关资源
    最近更新 更多