r - $后我怎么能帮帮?
问题描述
在编写一个旨在比较两个数据帧中的列的函数时,我希望弄清楚如何在 $ 之后引用指定为函数参数的变量。
考虑以下数据:
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)
}
使用后结果不正确:
有没有办法在 $ 之后砰砰砰地让我的功能成功?或者,有没有更好的方法来编写这个函数以避免这个问题?
解决方案
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
推荐阅读
- javascript - Typescript 将 es6 .js 依赖项转换为 es5
- node.js - 调试电子/节点应用程序时如何显示网络面板
- r - R:ggarange 增加多图的图标题和每个图的标题之间的距离
- javascript - Ajax附加下拉提交空值
- swift - 没有欧几里得距离计算的 MapKit 两点之间的距离
- java - 无法在 ViewHolder 中设置自定义字体
- javascript - 如何在Javascript中将索引关联数组的数组转换为逗号分隔的关联数组
- php - 如何将 jQuery 日历中选择的日期传递给 php?
- python - 从空数组创建 RGB 颜色
- python - Find_all_siblings 没有从 Python Beautiful Soup 中的论坛帖子中找到所有表行兄弟姐妹