首页 > 解决方案 > $后我怎么能帮帮?

问题描述

在编写一个旨在比较两个数据帧中的列的函数时,我希望弄清楚如何在 $ 之后引用指定为函数参数的变量。

考虑以下数据:

data1<-data.frame(ID=c(1,1,2,2,3,3),Amt=c(5,10,15,20,25,30),Term=c(2,3,2,3,2,3))
data2<-data.frame(Id=c(1,2,3),TERM=c(1,2,3))

而这个失败的功能:

two_df_function<-function(df,df2,id,id2,term,term2){

  id<-rlang::ensym(id)
  id2<-rlang::ensym(id2)
  term<-rlang::ensym(term)
  term2<-rlang::ensym(term2)

  data_out<-df%>%
    group_by(!!term)%>%
    mutate(Early=ifelse(!!id %in% df2$!!id2[df2$!!term2 < !!term],1,0))
}

我收到“错误:意外'!' 在:”

为了得到我想要的结果,我手动插入了数据框和列名:

data_out<-data1%>%
  group_by(Term)%>%
  mutate(Early=ifelse(ID %in% data2$Id[data2$TERM < Term],1,0))

产生:

在此处输入图像描述

因为我想要一个函数,所以我尝试通过简单地取出意外符号来解决。

以下将运行,但给出不正确的结果:

two_df_function<-function(df,df2,id,id2,term,term2){

  id<-rlang::ensym(id)
  id2<-rlang::ensym(id2)
  term<-rlang::ensym(term)
  term2<-rlang::ensym(term2)


  data_out<-df%>%
    group_by(!!term)%>%
    mutate(Early=ifelse(!!id %in% df2$id2[df2$term2 < !!term],1,0))

  return(data_out)

}

使用后结果不正确:

在此处输入图像描述

有没有办法在 $ 之后砰砰砰地让我的功能成功?或者,有没有更好的方法来编写这个函数以避免这个问题?

标签: rdplyrtidyr

解决方案


We can bang bang without $ using dplyr as follows. By the way, I think group_by is not needed in this case if you join the two data frames.

library(dplyr)

two_df <- function(df, df2, id, id2, term, term2){
  
  df_out <- df %>%
    left_join(df2, by = setNames(id2, id)) %>%
    mutate(Early = as.integer(.data[[term]] > .data[[term2]])) %>%
    select(-all_of(term2))
  
  return(df_out)
  
}

two_df(data1, data2, id = "ID", id2 = "Id", term = "Term", term2 = "TERM")
#   ID Amt Term Early
# 1  1   5    2     1
# 2  1  10    3     1
# 3  2  15    2     0
# 4  2  20    3     1
# 5  3  25    2     0
# 6  3  30    3     0

推荐阅读